我通过Oracle文档页面为 UPDATEXML 函数完成了示例: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm
现在,我正在尝试将其应用于我的数据库中的数据。我的数据库中的列是 CLOB (用于多个事情),因此我需要在执行xml相关操作之前将我的数据转换为xmltype。但是,我尝试返回以下错误SQL Error: ORA-00927: missing equal sign
。
有没有办法在不修改列数据类型的情况下更新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>'));
第3。将CLOB转换为XMLTYPE以从指定标记中提取值
SELECT EXTRACTVALUE(XMLTYPE(cdata),'/Warehouse/WaterAccess') as VAL from xwarehouses;
VAL | true
4。尝试使用UPDATE中的相同转换更新值
update XWAREHOUSES
set XMLTYPE(cdata) =
updatexml(XMLTYPE(cdata),'/Warehouse/WaterAccess/text()','false')
where msd_id = 1;
** 5。这会返回错误:
SQL Error: ORA-00927: missing equal sign
答案 0 :(得分:1)
好的,我解决了这2种不同的方式,基本上都是一样的,但一种是查询,一种是脚本。
将数据加载为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;
这不是最整洁的版本,因为我可能会使用来自解决方案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 :(得分:1)
来自ORACLE 11
不推荐使用用于更新XML数据的所有Oracle SQL函数。神谕 建议您改用XQuery Update。这些是 不推荐使用的XML更新函数:
Migration from Oracle Functions for Updating XML Data to XQuery Update
示例:
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;