Oracle UpdateXML()添加CDATA

时间:2017-09-27 23:30:13

标签: xml oracle plsql oracle12c xmltype

我有一个包含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>&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实例 NOT 有这个问题。

即。有三个实例可以打电话:

   SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')

......结果是:

<VALUES><![CDATA['NewValue']]></VALUES>

...未插入转义的&apos; &lt; &gt;字符。

因此,UpdateXML()似乎可以在不同的Oracle实例上以不同的方式工作,无论版本号如何。

1 个答案:

答案 0 :(得分:1)

感谢Shaun Peterson,答案是:

SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', XMLCdata('''NewValue'''))
  INTO my_new_xml
  FROM DUAL;