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