Bạn có thể chuyển đổi CLOB của mình thành một XMLType, giả sử rằng nó hợp lệ, chỉ với:
extractvalue(XMLType(RESPONSE_XML), ...
Không chắc tại sao loại cột của bạn không phải là XMLType nếu bạn đang lưu trữ XML trong đó, nhưng điều đó không hoàn toàn phù hợp.
Sau đó, bạn có thể cung cấp không gian tên cho 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';
.. nhưng bạn có nhiều ID, vì vậy bạn nhận được:ORA-19025: EXTRACTVALUE returns value of only one node
.
Và extractvalue
không được dùng nữa, như đã lưu ý trong tài liệu
Bạn có thể sử dụng XQuery thay vào đó, cụ thể ở đây là một XMLTable.
Giả sử bạn chỉ muốn ax2130:id
các giá trị được lồng vào bên trong ax2147:subscription
, bạn có thể sử dụng XQuery này:
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
Hoặc nếu bạn muốn bất kỳ ax:2130
nào ở bất kỳ đâu, kể cả nút trống, bạn có thể sử dụng:
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
Chỉ những không gian tên được tham chiếu trong XQuery mới cần được chỉ định trong mệnh đề XMLNamespaces.
Bạn có thể tham gia vào một bảng khác dựa trên các ID đã chọn nếu bạn cần:
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';