UPDATEXML抛出SQL错误:ORA-00927:尝试转换和更新CLOB数据类型时缺少等号
我通过Oracle文档页面为UPDATEXML函数完成了示例: 现在,我正试图将其应用于数据库中的数据。我的数据库中的列是CLOB(用于多种用途),因此在执行与xml相关的操作之前,我需要将数据转换为xmltype。但是,我尝试返回以下错误UPDATEXML抛出SQL错误:ORA-00927:尝试转换和更新CLOB数据类型时缺少等号,sql,oracle,plsql,Sql,Oracle,Plsql,我通过Oracle文档页面为UPDATEXML函数完成了示例: 现在,我正试图将其应用于数据库中的数据。我的数据库中的列是CLOB(用于多种用途),因此在执行与xml相关的操作之前,我需要将数据转换为xmltype。但是,我尝试返回以下错误SQL错误:ORA-00927:缺少等号 有没有一种方法可以在不修改列数据类型的情况下更新clob存储的xml 企图 使用我的数据库的数据类型重用Oracle示例。 1。创建表格 CREATE TABLE xwarehouses ( MSD_ID
SQL错误:ORA-00927:缺少等号
有没有一种方法可以在不修改列数据类型的情况下更新clob存储的xml
企图 使用我的数据库的数据类型重用Oracle示例。
1。创建表格
CREATE TABLE xwarehouses
(
MSD_ID INTEGER,
CDATA CLOB
);
2。添加数据
INSERT INTO xwarehouses VALUES
(1,
('<?xml version="1.0"?>
<Warehouse>
<WarehouseId>1</WarehouseId>
<WarehouseName>Southlake, Texas</WarehouseName>
<Building>Owned</Building>
<Area>25000</Area>
<Docks>2</Docks>
<DockType>Rear load</DockType>
<WaterAccess>true</WaterAccess>
<RailAccess>N</RailAccess>
<Parking>Street</Parking>
<VClearance>10</VClearance>
</Warehouse>'));
VAL| true
4。尝试使用更新中的相同转换更新值
update XWAREHOUSES
set XMLTYPE(cdata) =
updatexml(XMLTYPE(cdata),'/Warehouse/WaterAccess/text()','false')
where msd_id = 1;
**五,。这将返回错误:
SQL错误:ORA-00927:缺少等号
好的,我用两种不同的方法解决了这个问题,两种方法基本相同,但一种是查询,另一种是脚本
解决方案1
将数据加载为xmltype,然后执行xml操作,最后在执行更新之前转换回clob
update xwarehouses
set cdata =
(
select updatexml(xmltype(cdata),'/Warehouse/WaterAccess/text()','true').getclobval()
from xwarehouses where msd_id = 1
)
where msd_id = 1;
commit;
解决方案2
这不是最整洁的版本,因为我可能会通过解决方案1中的查询,添加一些变量。对于列出的所有转换,这基本上做了相同的事情
DECLARE
p_msg_id number := 1;
p_cdata xmltype;
p_value varchar(50) :='false';
p_data clob;
BEGIN
select cdata into p_data from xwarehouses;
p_cdata := xmltype(p_data);
select updatexml(p_cdata,'/Warehouse/WaterAccess/text()',p_value) into p_cdata from dual;
p_data := p_cdata.getclobval();
update xwarehouses
set cdata = p_data
where msd_id = p_msg_id;
commit;
END;
好的,我用两种不同的方法解决了这个问题,两种方法基本相同,但一种是查询,另一种是脚本 解决方案1 将数据加载为xmltype,然后执行xml操作,最后在执行更新之前转换回clob
update xwarehouses
set cdata =
(
select updatexml(xmltype(cdata),'/Warehouse/WaterAccess/text()','true').getclobval()
from xwarehouses where msd_id = 1
)
where msd_id = 1;
commit;
解决方案2
这不是最整洁的版本,因为我可能会通过解决方案1中的查询,添加一些变量。对于列出的所有转换,这基本上做了相同的事情
DECLARE
p_msg_id number := 1;
p_cdata xmltype;
p_value varchar(50) :='false';
p_data clob;
BEGIN
select cdata into p_data from xwarehouses;
p_cdata := xmltype(p_data);
select updatexml(p_cdata,'/Warehouse/WaterAccess/text()',p_value) into p_cdata from dual;
p_data := p_cdata.getclobval();
update xwarehouses
set cdata = p_data
where msd_id = p_msg_id;
commit;
END;
从甲骨文11
所有用于更新XML数据的Oracle SQL函数都已弃用。神谕
建议改用XQuery Update。这些是
不推荐使用的XML更新函数:
例如:
UPDATE xwarehouses SET cdata =
xmlserialize(document XMLQuery('copy $tmp := $source modify
(for $i in $tmp/Warehouse/WaterAccess/text()
return replace value of node $i
with "false")
return $tmp'
PASSING xmltype(cdata) as "source" RETURNING CONTENT))
WHERE cdata IS NOT NULL;
从甲骨文11
所有用于更新XML数据的Oracle SQL函数都已弃用。神谕
建议改用XQuery Update。这些是
不推荐使用的XML更新函数:
例如:
UPDATE xwarehouses SET cdata =
xmlserialize(document XMLQuery('copy $tmp := $source modify
(for $i in $tmp/Warehouse/WaterAccess/text()
return replace value of node $i
with "false")
return $tmp'
PASSING xmltype(cdata) as "source" RETURNING CONTENT))
WHERE cdata IS NOT NULL;
我认为setxmltype(cdata)=应该设置为cdata=并假设集合的右侧将隐式转换为CLOB。请尝试一下,让我知道。PL/SQL也是一个考虑的选项吗?如果我在集合中删除XMLType,但把它放在XMLUp更新中,我会得到<代码> SQL错误:ORA-900932:不一致的数据类型:预期Culb得到- 00932。00000-“不一致的数据类型:应为%s获得%s”。如果我删除两侧的XMLTYPE,则会得到:
SQL错误:ORA-00932:不一致的数据类型:应为-get-00932。00000-“不一致的数据类型:应为%s得到%s”
您的意思是在此处写入某种形式的存储过程而不是直接更新吗?我认为set-XMLTYPE(cdata)=应设置为cdata=,并假设集合的右侧将隐式转换为CLOB。请尝试一下,让我知道。PL/SQL也是一个考虑的选项吗?如果我在集合中删除XMLType,但把它放在XMLUp更新中,我会得到<代码> SQL错误:ORA-900932:不一致的数据类型:预期Culb得到- 00932。00000-“不一致的数据类型:应为%s获得%s”。如果我删除两侧的XMLTYPE,则会得到:SQL错误:ORA-00932:不一致的数据类型:应为-get-00932。00000-“不一致的数据类型:预期的%s得到了%s”
您的意思是在这里选择编写某种形式的存储过程而不是直接更新吗?