【问题标题】:Insert xml Node into a CLOB column with namespace in Oracle将 xml 节点插入到 Oracle 中具有命名空间的 CLOB 列中
【发布时间】:2015-09-10 13:38:26
【问题描述】:

我在 Oracle 11g 的 CLOB 列中有下一个 xml 值。

<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification">     
    <WEBSITE>WWW.VERLAAG.BE</WEBSITE>
    <CUSTOMERID>xxxxxx</CUSTOMERID>
    <Gender>M</Gender>
    <Telephone>0000000000</Telephone>
</Energy>

我想添加一个名为:Language 的新节点

看起来像这样:

<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification">     
    <WEBSITE>WWW.VERLAAG.BE</WEBSITE>
    <CUSTOMERID>xxxxxx</CUSTOMERID>
    <Gender>M</Gender>
    <Telephone>0000000000</Telephone>
    <Language></Language>
</Energy>

我用了下一句:

update tmp_tab_noemail_test_aankoop p1
set p1.sce_msg = insertchildxml(p1.sce_msg, '/Energy', 'Language',
                 xmltype('<Language><Language/>'),
                 'xmlns="http://euroconsumers.org/notifications/2009/01/notification')
.getclobval();

还有这个:

update tmp_tab_noemail_test_aankoop p1
set p1.sce_msg = APPENDCHILDXML(p1.sce_msg,
                 '/Energy',
                 XMLType('<Language><Language/>'),
                 'xmlns="http://euroconsumers.org/notifications/2009/01/notification')
.getclobval()

但是这些功能中的任何一个都可以正常工作。

有什么想法吗?

【问题讨论】:

  • “不工作”是什么意思?
  • 意思是,我无法通过这些查询将此节点插入到 CLOB 列的 xml 结构中。
  • 这并不比“不工作”更清楚。您应该显示您在问题中遇到的任何错误;或者如果您没有收到错误,那么您期望的结果和实际得到的结果。

标签: oracle oracle11g clob xmltype


【解决方案1】:

在您的两个语句中,您都没有将初始 CLOB 转换为 XMLType,并且新节点的结束标记格式错误 - 您使用的是 &lt;Language/&gt; 而不是 &lt;/Language&gt;。要么提供开始标签和结束标签,要么提供一个自关闭标签,而不是两者的混合。您还缺少命名空间中的结束双引号。

这两个都有效:

update tmp_tab_noemail_test_aankoop p1
set p1.sce_msg = insertchildxml(XMLType(p1.sce_msg), '/Energy', 'Language',
  XMLType('<Language></Language>'),
  'xmlns="http://euroconsumers.org/notifications/2009/01/notification"').getclobval();

或者:

update tmp_tab_noemail_test_aankoop p1
set p1.sce_msg = APPENDCHILDXML(XMLType(p1.sce_msg), '/Energy',
  XMLType('<Language></Language>'),
  'xmlns="http://euroconsumers.org/notifications/2009/01/notification"').getclobval();

后者看起来好一点,因为新标签显示为

<Language/>

而不是

<Language xmlns=""/>

您可以使用insertchild 保留命名空间,但随后它会显式出现在新节点中,即使它与顶级 Energy 命名空间匹配;这在功能上并不重要,但看起来有点奇怪。

【讨论】:

  • 我认为 this question 是相关的,尽管来自不同的帐户?
  • 嗨,Alex,对于这两种情况,句子都添加了 而不是 。你知道为什么吗?
  • @KhristianLiahut - 不;我在 11.2.0.3 中没有看到 appendchildxml,仅适用于 insertchildxml。不确定哪个是“正确的”。不过,您也可以为 appendchildxml 指定 xmlns。
  • @KhristianLiahut - 你指的是它,包括xmlns="" ;或者它们是自关闭标签而不是单独的打开/关闭标签?为什么这很重要——它们是等价的?如果您在要插入/附加的节点中提供了一个文本值,那么您当然会打开/关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-01-23
  • 2017-11-11
  • 1970-01-01
相关资源
最近更新 更多