更新Oracle SQL中的XML BLOB列

ccrfmcuu  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(226)

我必须使用PL/SQL更新存储在Oracle数据库19 c中BLOB列中的XML值。
我想将元素<ns35:AMOUNTLOCAL1>122000</ns35:AMOUNTLOCAL1>中的值122000更新为500

<ns0:WSMBBILLPAYMENTSERVICETTResponse xmlns:ns0="http://sample.com/ESBMBWEBSERVICE" xmlns:ns21="http://sample.com/FUNDSTRANSFERSAMESBMBTM" xmlns:ns3="http://sample.com/SAMHBILLPAY" xmlns:ns35="http://sample.com/TELLER" xmlns:ns28="http://sample.com/FUNDSTRANSFERSAMMBONLINEPAY" xmlns:ns19="http://sample.com/FUNDSTRANSFER" xmlns:ns5="http://sample.com/SAMHBILLPAYPAYBYMOBILE" xmlns:ns34="http://sample.com/FUNDSTRANSFERFTSAMESBMOBILESUBFEE" xmlns:ns22="http://sample.com/FUNDSTRANSFERSAMESBMBTTEP" xmlns:ns6="http://sample.com/CUSTOMER" xmlns:ns13="http://sample.com/ENQSAMMOBACCTWS" xmlns:ns26="http://sample.com/FUNDSTRANSFERSAMESBMOBILETTOA" xmlns:ns1="http://sample.com/ACCOUNT" xmlns:ns9="http://sample.com/ENQSAMESBACCTINQ" xmlns:ns32="http://sample.com/FUNDSTRANSFERFTSAMESBMOBILEPITV">
  <Status>
    <transactionId>TT230397M1GC</transactionId>
    <messageId>MOB230391644542177.00</messageId>
    <successIndicator>Success</successIndicator>
    <application>TELLER</application>
  </Status>
  <TELLERType id="DD230397M1GC">
    <ns35:TRANSACTIONCODE>983</ns35:TRANSACTIONCODE>
    <ns35:TELLERID1>2801</ns35:TELLERID1>
    <ns35:DRCRMARKER>CREDIT</ns35:DRCRMARKER>
    <ns35:CURRENCY1>KHR</ns35:CURRENCY1>
    <ns35:CUSTOMER1>166708</ns35:CUSTOMER1>
    <ns35:gACCOUNT1>
      <ns35:mACCOUNT1>
        <ns35:ACCOUNT1>1012448283</ns35:ACCOUNT1>
        <ns35:AMOUNTLOCAL1>122000</ns35:AMOUNTLOCAL1>
        <ns35:sgNARRATIVE1>
          <ns35:NARRATIVE1>
            <ns35:NARRATIVE1>3203738210-SAM000007828</ns35:NARRATIVE1>
          </ns35:NARRATIVE1>
        </ns35:sgNARRATIVE1>
      </ns35:mACCOUNT1>
    </ns35:gACCOUNT1>
    <ns35:VALUEDATE1>20230208</ns35:VALUEDATE1>
    <ns35:EXPOSUREDATE1>20230208</ns35:EXPOSUREDATE1>
    <ns35:CURRMARKET1>10</ns35:CURRMARKET1>
    <ns35:POSTYPE1>TR</ns35:POSTYPE1>
    <ns35:CURRENCY2>KHR</ns35:CURRENCY2>
    <ns35:TELLERID2>2801</ns35:TELLERID2>
    <ns35:ACCOUNT2>KHR1000028010182</ns35:ACCOUNT2>
    <ns35:AMOUNTLOCAL2>122000</ns35:AMOUNTLOCAL2>
    <ns35:NETAMOUNT>122000</ns35:NETAMOUNT>
    <ns35:POSTYPE2>TR</ns35:POSTYPE2>
    <ns35:gNARRATIVE2>
      <ns35:NARRATIVE2>3203738210-SAM000007828</ns35:NARRATIVE2>
    </ns35:gNARRATIVE2>
    <ns35:WAIVECHARGES>NO</ns35:WAIVECHARGES>
    <ns35:gNEWCUSTBAL>
      <ns35:NEWCUSTBAL>10069600</ns35:NEWCUSTBAL>
    </ns35:gNEWCUSTBAL>
    <ns35:AUTHDATE>20230208</ns35:AUTHDATE>
    <ns35:gSTMTNO>
      <ns35:STMTNO>201281644542178.00</ns35:STMTNO>
      <ns35:STMTNO>1-2</ns35:STMTNO>
      <ns35:STMTNO>KH0010001</ns35:STMTNO>
      <ns35:STMTNO>201281644542178.01</ns35:STMTNO>
      <ns35:STMTNO>1-2</ns35:STMTNO>
    </ns35:gSTMTNO>
    <ns35:CURRNO>1</ns35:CURRNO>
    <ns35:gINPUTTER>
      <ns35:INPUTTER>16445_SAM.PHEAROM123_I_INAU_OFS_MOB</ns35:INPUTTER>
    </ns35:gINPUTTER>
    <ns35:gDATETIME>
      <ns35:DATETIME>2302081142</ns35:DATETIME>
      <ns35:DATETIME>2302081142</ns35:DATETIME>
    </ns35:gDATETIME>
    <ns35:AUTHORISER>16445_SAM.PHEAROM123_OFS_MOB</ns35:AUTHORISER>
    <ns35:SAMHBILLPAY>3203738210-សុហជា</ns35:SAMHBILLPAY>
    <ns35:LSAMSUPTYPE>EDC</ns35:LSAMSUPTYPE>
    <ns35:ADDITIONALDATA>អគ្គិសនីážáž¶áž€áŸ‚ážœ</ns35:ADDITIONALDATA>
    <ns35:ATUNIQUEID>SAM000007828</ns35:ATUNIQUEID>
  </TELLERType>
</ns0:WSMBBILLPAYMENTSERVICETTResponse>

我搜索了前面的答案,但似乎没有一个发布的xml具有这种复杂的元素层次结构。
先谢谢你了。

af7jpaap

af7jpaap1#

如果WSMBBILLPAYMENTSERVICETTResponse标记的目标命名空间是http://sample.com/ESBMBWEBSERVICE,则从xml <WSMBBILLPAYMENTSERVICETTResponse xmlns="http://sample.com/ESBMBWEBSERVICE"中删除前缀ns0,否则按以下方式添加前缀

<ns0:Status>
  <ns0:transactionId>TT230397M1GC</ns0:transactionId>
  <ns0:messageId>MOB230391644542177.00</ns0:messageId>
  <ns0:successIndicator>Success</ns0:successIndicator>
  <ns0:application>TELLER</ns0:application>
</ns0:Status>
<ns0:TELLERType id="DD230397M1GC">

考虑到目标名称空间是http://sample.com/ESBMBWEBSERVICE,下面是工作示例

declare
  l_out clob;
  l_xml xmltype;
  l_new_value varchar2(10):='500';
begin
  select xmlquery(
    'declare default element namespace "http://sample.com/ESBMBWEBSERVICE";
     declare namespace ns21="http://sample.com/FUNDSTRANSFERSAMESBMBTM";
     declare namespace ns3="http://sample.com/SAMHBILLPAY";
     declare namespace ns35="http://sample.com/TELLER";
     declare namespace ns28="http://sample.com/FUNDSTRANSFERSAMMBONLINEPAY";
     copy $tmp := .
     modify replace value of node $tmp/WSMBBILLPAYMENTSERVICETTResponse/TELLERType/ns35:gACCOUNT1/ns35:mACCOUNT1/ns35:AMOUNTLOCAL1 with "'||l_new_value||'"
     return $tmp
    '
    PASSING xmlfile RETURNING CONTENT)
    into l_xml
from
(
    select xmltype(blob_column) as xmlfile from blob_table where <condition>
);
update blob_table
set blob_column=to_blob(l_xml)
where <condition>;
commit;
end;

相关问题