Обновите тег xml в столбце CLOB в Oracle

У меня есть это значение xml в столбце CLOB в Oracle 11g:

<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 для нескольких строк.

Я использовал следующую ниже команду sql:

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

Но не работает.

У вас есть идеи по изменению только значений тега xml для InsertDate?

Заранее спасибо


person user1037527    schedule 23.06.2015    source источник


Ответы (1)


У вас есть пространство имен в вашем узле Energy верхнего уровня, поэтому без него вы не сопоставляетесь; документация UPDATEXML показывает, что вы можете дополнительно указать строку пространства имен .

Итак, вы можете сделать это, используя данные вашего примера:

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();

... но, вероятно, лучше указать пространство имен.

person Alex Poole    schedule 23.06.2015
comment
Заранее спасибо за вашу помощь. - person user1037527; 24.06.2015
comment
@Alex Poole: у меня аналогичное требование, но вместо обновления значения внутри тега мне нужно обновить само имя тега. Например, мне нужно обновить тег «InsertDate» до тега «insertDate». Любое предложение, пожалуйста? Заранее спасибо. - person Sivaram Chintalapudi; 08.06.2021
comment
@SivaramChintalapudi - вы должны задать новый вопрос, предоставив всю необходимую информацию. (Но, возможно, сначала посмотрите на FLWOR modify rename node.) - person Alex Poole; 08.06.2021