我有一个包含XMLType
列的表格。我编写了一个匿名块来循环遍历符合某个条件的行,然后它会查看每个记录并在需要时更新一些XML。
表中存储的原始XML看起来像这样:
<VALUES><![CDATA['Value']]></VALUES>
我的循环将从每个块中拉出现有值,如下所示:
SELECT xml.txtValue
INTO strValue
FROM my_table s,
XMLTable('/PATH/*'
PASSING s.xmlTypeColumn
COLUMNS txtValue VARCHAR2(100 CHAR) PATH 'VALUES/text()') xml
WHERE s.pk = 1234
AND xml.txtValue like '%Value%';
结果是变量strValue
包含:'Value'然后我评估和操作等。
以下是脚本更新部分的简化示例(已移除的循环和业务逻辑,以显示我对一个特定记录的问题):
DECLARE
my_xml XMLTYPE;
my_new_xml XMLTYPE;
BEGIN
SELECT my_xml_column
INTO my_xml
FROM my_table
WHERE pk = 1234;
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '''NewValue''')
INTO my_new_xml
FROM DUAL;
UPDATE my_table
SET my_xml_column = my_new_xml
WHERE pk = 1234;
END;
结果是XML中的特定路径更新为:
<VALUES>'NewValue'</VALUES>
如果我按如下方式更改我的代码:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')
结果是XML更新为:
<VALUES><![CDATA['NewValue']]></VALUES>
我实际上想要的是:
<VALUES><![CDATA['NewValue']]></VALUES>
如果没有<![CDATA[ ]]>
为我逃避,我怎样才能正确地获取UpdateXML()
包装?
注意:我最初发现了两个遇到此问题的12.1.0.2实例,但后来发现了两个12.1.0.2实例和一个11.2.0.4实例 NOT 有这个问题。
即。有三个实例可以打电话:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')
......结果是:
<VALUES><![CDATA['NewValue']]></VALUES>
...未插入转义的' < >
字符。
因此,UpdateXML()
似乎可以在不同的Oracle实例上以不同的方式工作,无论版本号如何。
答案 0 :(得分:1)
感谢Shaun Peterson,答案是:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', XMLCdata('''NewValue'''))
INTO my_new_xml
FROM DUAL;