CLOBをXMLTypeに変換できますが、それが有効であると仮定すると、次のようになります。
extractvalue(XMLType(RESPONSE_XML), ...
XMLを格納している場合、列タイプがXMLTypeでない理由はわかりませんが、完全に関連しているわけではありません。
次に、名前空間をextractvalue()
に指定できます。 :
SELECT extractvalue(XMLType(RESPONSE_XML),
'//ax2130:id/text()',
'xmlns:ax2130="http://core.data.soap.CDRator.com/xsd"')
FROM SOAP_MONITORING
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
..ただし、複数のIDがあるため、次のようになります。ORA-19025: EXTRACTVALUE returns value of only one node
。
そしてextractvalue
ドキュメントに記載されているように、は非推奨です
XQuery を使用できます 代わりに、具体的にはここではXMLTableです。
ax2130:id
だけが必要だと仮定します ax2147:subscription
内にネストされた値 、このXQueryを使用できます:
SELECT xt.id
FROM SOAP_MONITORING sm
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
'http://service.soap.CDRator.com' as "ns",
'http://core.data.soap.CDRator.com/xsd' as "ax2130",
'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147"
),
'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions
return $i/ax2130:id'
passing XMLType(sm.RESPONSE_XML)
columns "ID" number path '/') xt
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
ID
---------------------
201501070917439804
201501070917439804
2 rows selected
または、ax:2130
が必要な場合 空白のものを含め、どこにでもノードを使用できます:
SELECT xt.id
FROM SOAP_MONITORING sm
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://core.data.soap.CDRator.com/xsd' as "ax2130"
),
'for $i in //ax2130:id return $i'
passing XMLType(sm.RESPONSE_XML)
columns "ID" number path '/') xt
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder';
ID
---------------------
201501070917439804
201501070917439804
3 rows selected
XQueryで参照されている名前空間のみをXMLNamespaces句で指定する必要があります。
必要に応じて、選択したIDに基づいて別のテーブルに参加できます。
SELECT xt.id
FROM SOAP_MONITORING sm
CROSS JOIN XMLTable(XMLNAMESPACES (
...) xt
JOIN someothertable sot on sot.id = xt.id
where sm.WEB_SERVICE_NAME='RatorWebShopService'
and sm.WEB_METHOD_NAME='placeShopOrder';