Oracle UpdateXML() 添加 CDATA
Posted
技术标签:
【中文标题】Oracle UpdateXML() 添加 CDATA【英文标题】:Oracle UpdateXML() add CDATA 【发布时间】:2017-09-27 23:30:12 【问题描述】:我有一个带有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
包含:“值”,然后我对其进行评估和操作等。
这是脚本更新部分的简化示例(删除循环和业务逻辑以显示我对一个特定记录的问题):
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>&apos;NewValue&apos;</VALUES>
如果我将代码更改如下:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')
结果是 XML 更新为:
<VALUES>&lt;![CDATA[&apos;NewValue&apos;]]&gt;</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'']]>')
...结果是:
<VALUES><![CDATA['NewValue']]></VALUES>
...没有插入转义的&apos; &lt; &gt;
字符。
因此,无论版本号如何,UpdateXML()
似乎在不同的 Oracle 实例上的工作方式都不同。
【问题讨论】:
看看 XMLCDATA 函数docs.oracle.com/cd/B19306_01/server.102/b14200/functions216.htm。应该可以用你的 NewValue 来调用它。 是的,成功了,谢谢! 【参考方案1】:感谢Shaun Peterson,答案是:
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', XMLCdata('''NewValue'''))
INTO my_new_xml
FROM DUAL;
【讨论】:
以上是关于Oracle UpdateXML() 添加 CDATA的主要内容,如果未能解决你的问题,请参考以下文章