我有一个带有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实例没有这个问题。
例如,有三个实例能够调用:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')...and的结果是:
<VALUES><![CDATA['NewValue']]></VALUES>
...without插入的转义' < >字符。
因此,无论版本号如何,UpdateXML()在不同的Oracle实例上的工作方式可能有所不同。
发布于 2017-09-28 15:59:23
多亏了Shaun Peterson,答案是:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', XMLCdata('''NewValue'''))
INTO my_new_xml
FROM DUAL;https://stackoverflow.com/questions/46458723
复制相似问题