Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wähle ich einen bestimmten Knotennamen und seine Werte in XML mit einer Oracle SQL-Abfrage aus?

Sie können Ihr CLOB in einen XMLType umwandeln, sofern es gültig ist, einfach mit:

extractvalue(XMLType(RESPONSE_XML), ...

Nicht sicher, warum Ihr Spaltentyp nicht XMLType ist, wenn Sie XML darin speichern, aber das ist nicht ganz relevant.

Sie könnten dann den Namensraum an extractvalue() übergeben :

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

.. aber Sie haben mehrere IDs, also erhalten Sie:ORA-19025: EXTRACTVALUE returns value of only one node .

Und extractvalue ist veraltet, wie in der Dokumentation angegeben

Sie können XQuery verwenden stattdessen speziell hier eine XMLTable.

Angenommen, Sie möchten nur die ax2130:id Werte, die in ax2147:subscription verschachtelt sind , können Sie diese XQuery verwenden:

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 

Oder wenn Sie ax:2130 wollen Knoten an beliebiger Stelle, einschließlich des leeren, können Sie verwenden:

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 

Nur die Namespaces, auf die in XQuery verwiesen wird, müssen in der XMLNamespaces-Klausel angegeben werden.

Sie können basierend auf den ausgewählten IDs bei Bedarf an einer anderen Tabelle teilnehmen:

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