sql >> Database >  >> RDS >> Oracle

Hoe een bepaalde Node-naam en zijn waarden in XML selecteren met behulp van Oracle SQL-query?

U kunt uw CLOB converteren naar een XMLType, aangenomen dat het geldig is, gewoon met:

extractvalue(XMLType(RESPONSE_XML), ...

Ik weet niet zeker waarom uw kolomtype geen XMLType is als u er XML in opslaat, maar dat is niet helemaal relevant.

U kunt dan de naamruimte opgeven voor 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';

.. maar je hebt meerdere ID's, dus je krijgt:ORA-19025: EXTRACTVALUE returns value of only one node .

En extractvalue is verouderd, zoals vermeld in de documentatie

U kunt XQuery gebruiken in plaats daarvan, hier specifiek een XMLTable.

Ervan uitgaande dat u alleen de ax2130:id . wilt waarden genest in ax2147:subscription , kunt u deze XQuery gebruiken:

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 

Of als je een ax:2130 . wilt knooppunt overal, inclusief de lege, kunt u gebruiken:

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 

Alleen de naamruimten waarnaar in de XQuery wordt verwezen, hoeven te worden opgegeven in de clausule XMLNamespaces.

U kunt deelnemen aan een andere tafel op basis van de geselecteerde ID's als dat nodig is:

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. Referentiecursor gaat verloren in XMLType.createxml

  2. MySQL-fout 1170 (42000):BLOB/TEXT-kolom gebruikt in sleutelspecificatie zonder sleutellengte

  3. Queryresultaten exporteren naar een CSV-bestand in SQL Developer (Oracle)

  4. Selecteer rijen tussen een opgegeven rij tot een rij met een bepaalde voorwaarde