在 Oracle 的 CLOB 列中更新 xml 标记

Posted

技术标签:

【中文标题】在 Oracle 的 CLOB 列中更新 xml 标记【英文标题】:Update xml tag in a CLOB column in Oracle 【发布时间】:2015-06-23 12:33:45 【问题描述】:

我在 Oracle 11g 的 CLOB 列中有这个 xml 值:

<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification">    
    <Gender>M</Gender>
    <FirstName>MAR</FirstName>
    <Name>VAN HALL</Name>
    <Email/><Telephone>000000000</Telephone>
    <InsertDate>2013-10-09</InsertDate>
</Energy>

我想更新几行的 InserDate 的值。

我正在使用 next 下面的 sql 命令:

update tmp_tab_noemail_test p1 
set p1.sce_msg = updatexml(xmltype(p1.sce_msg),
                 '//Energy/InsertDate/text()','Not Valid').getClobVal()

但不工作。

你有什么想法只修改InsertDate的xml标签的值吗?

提前致谢

【问题讨论】:

【参考方案1】:

您的*** Energy 节点中有一个命名空间,因此如果没有,您将无法匹配; the UPDATEXML documentation 表明您可以选择提供命名空间字符串。

所以你可以使用你的示例数据来做到这一点:

create table tmp_tab_noemail_test (sce_msg clob);
insert into tmp_tab_noemail_test values (
'<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification">    
    <Gender>M</Gender>
    <FirstName>MAR</FirstName>
    <Name>VAN HALL</Name>
    <Email/><Telephone>000000000</Telephone>
    <InsertDate>2013-10-09</InsertDate>
</Energy>');

update tmp_tab_noemail_test p1 
set p1.sce_msg = updatexml(xmltype(p1.sce_msg),
  '/Energy/InsertDate/text()','Not Valid',
  'xmlns="http://euroconsumers.org/notifications/2009/01/notification"').getClobVal();

之后你会得到:

select sce_msg from tmp_tab_noemail_test;

SCE_MSG                                                                         
--------------------------------------------------------------------------------
<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification"><Gender>M</Gender><FirstName>MAR</FirstName><Name>VAN HALL</Name><Email/><Telephone>000000000</Telephone><InsertDate>Not Valid</InsertDate></Energy>

或者稍微少一点滚动:

select XMLQuery('//*:InsertDate' passing XMLType(sce_msg) returning content) as insertdate
from tmp_tab_noemail_test;

INSERTDATE                                                                      
--------------------------------------------------------------------------------
<InsertDate xmlns="http://euroconsumers.org/notifications/2009/01/notification">Not Valid</InsertDate>

您还可以使用通配符更新:

update tmp_tab_noemail_test p1 
set p1.sce_msg = updatexml(xmltype(p1.sce_msg),
  '/*:Energy/*:InsertDate/text()','Not Valid').getClobVal();

...但最好指定命名空间。

【讨论】:

提前感谢您的帮助。 @Alex Poole:我有类似的要求,但我需要更新标签名称本身,而不是更新标签内的值。例如,我需要将“InsertDate”标签更新为“insertDate”标签。请问有什么建议吗?提前致谢。 @SivaramChintalapudi - 您应该提出一个新问题,提供所有相关信息。 (但也许先看看 FLWOR modify rename node。)

以上是关于在 Oracle 的 CLOB 列中更新 xml 标记的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g:从 CLOB 和表更新中读取 XML 记录

从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记

我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中

从 CLOB 列中过滤非 XML 数据

从clob列中提取xml元素时出错

在 Oracle 10g 上加载超过 64K 的 XML