【问题标题】:Oracle updateXml "less than sign" as textOracle updateXml“小于号”作为文本
【发布时间】:2013-06-10 09:12:35
【问题描述】:

我有xml文档

<d>
  <r>a&lt;b</r>
</d>

我想将其更新为

<d>
  <r>a&lt;b or c&gt;d</r>
</d>

使用 updateXML 语句。

执行

select updateXML(xmltype('<d><r>a&lt;b</r></d>'),
                 '/d/r[1]/text()',
                 'a&lt;b or c&gt;d')
  from dual;

返回

<d>
  <r>a&amp;lt;b or c&amp;gt;d</r>
</d>

因为“&”不好。

执行

select updateXML(xmltype('<d><r>a&lt;b</r></d>'),
                 '/d/r[1]/text()',
                 'a<b or c>d')
  from dual;

抛出

ORA-31067 XML 节点必须使用相同类型的有效节点进行更新。

我怎样才能达到预期的效果?

编辑:ORA-31067 仅在 10g 数据库中引发。在 11g 中是正确的查询。

EDIT2:在 10.2.0.3 版本上出现错误,在 10.2.0.5 上没有出现。可能是一个错误?

【问题讨论】:

  • 它是否与“& l t;”一起使用(带空格)?
  • 不,解析器找到 '&' 并抛出相同的错误。
  • @Kotodid,如果您尝试 htf.escape_sc('a&lt;b or c&gt;d') 会发生什么?顺便说一句,您使用的是什么版本?因为在 11g 上它可以工作 sqlfiddle.com/#!4/d41d8/12128
  • htf.escape_sc 只是将 替换为 <>,所以我在我的问题中得到了第一个样本。 DB版本为10g。
  • @Kotodid,这不是你想要的吗?

标签: oracle xmltype updatexml


【解决方案1】:

您可以使用这种丑陋的解决方法:

select dbms_xmlgen.convert(updateXML(xmltype('<d><r>a&lt;b</r></d>'),
                 '/d/r[1]/text()',
                 'a&lt;b or c&gt;d').getStringVal(), 1)
from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2014-01-27
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2018-12-20
    相关资源
    最近更新 更多