更新Clob中存储的XML值



有人知道如何在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;

最新更新