Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment sélectionner un nom de nœud particulier et ses valeurs en XML à l'aide d'une requête Oracle SQL ?

Vous pouvez convertir votre CLOB en XMLType, en supposant qu'il soit valide, simplement avec :

extractvalue(XMLType(RESPONSE_XML), ...

Vous ne savez pas pourquoi votre type de colonne n'est pas XMLType si vous y stockez du XML, mais ce n'est pas tout à fait pertinent.

Vous pouvez ensuite fournir l'espace de noms à 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';

.. mais vous avez plusieurs identifiants, vous obtenez donc :ORA-19025: EXTRACTVALUE returns value of only one node .

Et extractvalue est obsolète, comme indiqué dans la documentation

Vous pouvez utiliser XQuery à la place, spécifiquement ici un XMLTable.

En supposant que vous ne vouliez que le ax2130:id valeurs imbriquées dans ax2147:subscription , vous pouvez utiliser ce XQuery :

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 

Ou si vous voulez un ax:2130 nœud n'importe où, y compris le nœud vide, vous pouvez utiliser :

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 

Seuls les espaces de noms référencés dans XQuery doivent être spécifiés dans la clause XMLNamespaces.

Vous pouvez rejoindre une autre table en fonction des identifiants sélectionnés si vous devez :

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