При реализации Oracle в XML возможно несколько способов измельчения определенной капусты. Вот решение, которое использует XMLTable()
для изоляции атрибутов.
Я поместил ваше сообщение SOAP в таблицу со столбцом XMLType:
SQL> set long 5000
SQL> select xt.xmlmsg
2 from xt
3 where id = 1
4 /
XMLMSG
--------------------------------------------------------------------------------
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap="http://soap.service.****.com">
<soapenv:Header />
<soapenv:Body>
<soap:UpdateElem>
<soap:request>
<soap:att1>123456789</soap:att1>
<soap:att2 xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
<soap:att3>L</soap:att3>
.....
</soap:request>
</soap:UpdateElem>
</soapenv:Body>
</soapenv:Envelope>
SQL>
Этот SELECT использует XPath для извлечения атрибутов в виде столбцов. Обратите внимание на использование предложения XMLTable()
XMLNAMESPACES для определения пространств имен.
SQL> select
2 atts.att1
3 , atts.att2
4 , atts.att3
5 from xt
6 , xmltable(
7 xmlnamespaces(
8 'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv"
9 , 'http://soap.service.****.com' as "soap"
10 , 'http://www.w3.org/2001/XMLSchema-instance' as "xsi"
11 )
12 , '/soapenv:Envelope/soapenv:Body/soap:UpdateElem/soap:request'
13 passing xt.xmlmsg
14 columns
15 att1 number path 'soap:att1'
16 , att2 varchar2(10) path 'soap:att2/@xsi:nil'
17 , att3 char(1) path 'soap:att3'
18 ) atts
19 where xt.id = 1
20 /
ATT1 ATT2 A
---------- ---------- -
123456789 true L
SQL>