首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UpdateXML()添加CDATA

UpdateXML()添加CDATA
EN

Stack Overflow用户
提问于 2017-09-27 23:30:12
回答 1查看 807关注 0票数 0

我有一个带有XMLType列的表。我编写了一个匿名块来循环遍历符合特定条件的行,然后它将查看每条记录,并在需要时更新一些XML。

存储在表中的原始XML如下所示:

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

我的循环将从每个块中提取现有的值,如下所示:

代码语言:javascript
复制
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‘,然后我对其进行评估和操作等等。

下面是脚本的更新部分的一个简化示例(删除循环和业务逻辑,用一个特定的记录显示我的问题):

代码语言:javascript
复制
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>

如果我按以下方式更改代码:

代码语言:javascript
复制
   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实例没有这个问题。

例如,有三个实例能够调用:

代码语言:javascript
复制
   SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', '<![CDATA[''NewValue'']]>')

...and的结果是:

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-09-28 15:59:23

多亏了Shaun Peterson,答案是:

代码语言:javascript
复制
SELECT UPDATEXML (my_xml, '/PATH/VALUES/text()', XMLCdata('''NewValue'''))
  INTO my_new_xml
  FROM DUAL;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46458723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档