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>'NewValue'</VALUES>

如果我将代码更改如下:

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

结果是 XML 更新为:

&lt;VALUES&gt;&amp;lt;![CDATA[&amp;apos;NewValue&amp;apos;]]&amp;gt;&lt;/VALUES&gt;

实际上想要的是:

&lt;VALUES&gt;&lt;![CDATA['NewValue']]&gt;&lt;/VALUES&gt;

我怎样才能正确地将&lt;![CDATA[ ]]&gt; 包装器放入其中,而UpdateXML() 不会为我转义它?

注意:我最初发现两个 12.1.0.2 实例存在此问题,但后来我发现两个 12.1.0.2 实例和一个 11.2.0.4 实例没有有这个问题。

即三个实例能够调用:

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

...结果是:

&lt;VALUES&gt;&lt;![CDATA['NewValue']]&gt;&lt;/VALUES&gt;

...没有插入转义的&amp;apos; &amp;lt; &amp;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的主要内容,如果未能解决你的问题,请参考以下文章

plsql updatexml-无法根据属性更新值

MYSQL updatexml报错注入

报错注入分析之updatexml注入

学习笔记 UpdateXml() MYSQL显错注入

oracle修改TNSLSNR的端口

Pentaho CDA:基本身份验证和 CORS 冲突