Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để chọn một tên Node cụ thể và các giá trị của nó trong XML bằng cách sử dụng truy vấn SQL của Oracle?

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 .

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';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01775:chuỗi lặp lại các từ đồng nghĩa

  2. Làm cách nào để thêm truy vấn thời gian trong Oracle?

  3. Đọc biến clob từng dòng

  4. Cách Chèn Dấu thời gian trong Oracle ở Định dạng Cụ thể

  5. Lặp qua các giá trị được xác định trước