2017-08-18 14 views
1

が、私は次のリンクは非常に有用であることが分かっ別のテーブルに参加するが、私は以前の記事で同じデータを使用すること更新xmlタグは -

Update xml tag in a CLOB column in Oracle

にさらにお願いしたいと思います:

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

今、別のテーブルのアカウントを検索したい場合はどうすればいいですか?列:acct_numnamedate_of_birth

InsertDate tag value = Account.date_of_birth where Name tag value = Account.nameを更新するにはどうすればよいですか?

できますか?ありがとう!

答えて

0

私が正しく質問を理解している場合、あなたは、tmp_tab_noemail_testからNamerowidを抽出Account表とそれらを結合することができ、更新されたXMLを取得し、使用してmerge先フォルダ内の更新(ROWIDによる) -

create table Account (acct_num varchar2(20), name varchar2(255), date_of_birth date); 

insert into Account 
values(123, 'VAN HALL', sysdate); 
commit; 

merge into tmp_tab_noemail_test t 
using 
(
select rid, updatexml(xmltype(sce_msg), 
     '/Energy/InsertDate/text()', to_char(date_of_birth, 'yyyy-mm-dd'), 
     'xmlns="http://euroconsumers.org/notifications/2009/01/notification"').getClobVal() as sce_msg 
from 
    (select t.sce_msg, t.rid, t.name, a.date_of_birth 
    from 
     (select sce_msg, extractvalue(xmltype(sce_msg), 
       '/Energy/Name', 
       'xmlns="http://euroconsumers.org/notifications/2009/01/notification"') as name, 
       rowid as rid 
     from tmp_tab_noemail_test) t, Account a 
    where t.name = a.name) 
) s 
ON (t.ROWID = s.RID) 
WHEN MATCHED THEN 
UPDATE SET 
    T.sce_msg = S.sce_msg;