将 xml 节点插入到 Oracle 中具有命名空间的 CLOB 列中

Insert xml Node into a CLOB column with namespace in Oracle

我在 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>

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

看起来像这样:

<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 转换为 XMLType,并且新节点的结束标记格式不正确 - 您有 <Language/> 而不是 </Language>。要么提供开始和结束标签,要么提供一个自关闭标签,而不是两者的混合。您还缺少命名空间中的结束双引号。

这两个都有效:

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 命名空间相匹配;这在功能上无关紧要,但看起来有点奇怪。