有人知道如何在xml中更改特定值的解决方案吗?XML存储在Clob数据类型中。
我的XML看起来像:
<settings name="TEST_NAME" path="TEST_PATH">
<values>
<value param="Version">20200207</value>
</values>
<collections>
<collection name="Items">
<values>
<value param="TEST_PARAM">true</value>
</values>
<collections>
</collection>
<collection name="TEST_COL">
<values>
<value param="DockedLeft">0</value>
</values>
<collections>
<collection name="ItemLink0">
<values>
<value param="ItemName">TEST_PARAM</value>
</values>
</collection>
</collections>
</collection>
</collection>
</collections>
我需要更新的是";TEST_PARAM";TEST_COL集合内。集合名称itemlink0可以不同。谢谢你的回答!
我创建了一些有效的示例XML,并将其插入到CLOB列中。说明如何使用XMLQuery和SQL更新就足够了。
CREATE table xml_tbl (xml_str CLOB)
INSERT INTO xml_tbl VALUES(
'<settings name="TEST_NAME" path="TEST_PATH">
<collections>
<collection name="TEST_COL">
<values>
<value param="DockedLeft">0</value>
</values>
<collections>
<collection name="ItemLink0">
<values>
<value param="ItemName">TEST_PARAM</value>
</values>
</collection>
</collections>
</collection>
</collections>
</settings>')
元素值可以通过将CLOB转换为XMLType和使用XMLQuery更新XML来更新。具有动态属性名称的元素可以是XMLQuery的PASSING子句中的PL/SQL变量。
DECLARE
l_dyn_attr_name VARCHAR2(100):= 'ItemLink0';
l_element_value VARCHAR2(100):= 'new value';
BEGIN
UPDATE xml_tbl xt
SET xt.xml_str =
XMLTYPE.GETCLOBVAL(XMLQuery('copy $i := $x1 modify
(for $j in $i/settings/collections/collection[@name="TEST_COL"]/collections/collection[@name=$dynamic_attr_name]/values/value
return replace value of node $j with $new_elem_value)
return $i' PASSING XMLTYPE(xt.xml_str) AS "x1"
,l_dyn_attr_name AS "dynamic_attr_name"
,l_element_value AS "new_elem_value" RETURNING CONTENT));
COMMIT;
END;