oracle 更新Clob中存储的XML值

hrirmatl  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(144)

有 没有 人 知道 如何 在 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 _ COL 集合 中 的 " TEST _ PARAM " 。 集合 名称 * * itemlink0 * * 可以 不同 。 感谢 您 的 回答 !

3phpmpom

3phpmpom1#

我创建了一些有效的示例XML并将其插入到CLOB列中。

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或从XMLType转换CLOB,并利用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;

相关问题