Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara memilih nama Node tertentu dan nilainya dalam XML menggunakan kueri Oracle SQL?

Anda dapat mengonversi CLOB Anda ke XMLType, dengan asumsi itu valid, hanya dengan:

extractvalue(XMLType(RESPONSE_XML), ...

Tidak yakin mengapa jenis kolom Anda bukan XMLType jika Anda menyimpan XML di dalamnya, tetapi itu tidak sepenuhnya relevan.

Anda kemudian dapat memberikan namespace ke 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';

.. tetapi Anda memiliki beberapa ID, sehingga Anda mendapatkan:ORA-19025: EXTRACTVALUE returns value of only one node .

Dan extractvalue tidak digunakan lagi, sebagaimana tercantum dalam dokumentasi

Anda dapat menggunakan XQuery sebagai gantinya, khususnya di sini XMLTable.

Dengan asumsi Anda hanya menginginkan ax2130:id nilai bersarang di dalam ax2147:subscription , Anda dapat menggunakan XQuery ini:

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 

Atau jika Anda ingin ax:2130 simpul di mana saja, termasuk yang kosong, Anda dapat menggunakan:

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 

Hanya ruang nama yang dirujuk dalam XQuery yang perlu ditentukan dalam klausa XMLNamespaces.

Anda dapat bergabung ke tabel lain berdasarkan ID yang dipilih jika Anda perlu:

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. Bisakah Anda memiliki INNER JOIN tanpa kata kunci ON?

  2. Bagaimana cara menghilangkan karakter NUL di database Oracle?

  3. Oracle 11g - Temukan Catatan dalam CLOB dengan Umpan Jalur Pengembalian Kereta

  4. Instalasi Oracle 12c gagal mengakses lokasi sementara

  5. cara memanggil fungsi di oracle