sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo seleccionar un nombre de nodo en particular y sus valores en XML utilizando la consulta Oracle SQL?

Puede convertir su CLOB a un XMLType, suponiendo que sea válido, solo con:

extractvalue(XMLType(RESPONSE_XML), ...

No estoy seguro de por qué su tipo de columna no es XMLType si está almacenando XML en él, pero eso no es del todo relevante.

Luego podría proporcionar el espacio de nombres a 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';

.. pero tiene varias ID, por lo que obtiene:ORA-19025: EXTRACTVALUE returns value of only one node .

Y extractvalue está en desuso, como se indica en la documentación

Puede usar XQuery en cambio, específicamente aquí una XMLTable.

Asumiendo que solo quieres el ax2130:id valores anidados dentro de ax2147:subscription , puede usar este 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 

O si quieres cualquier ax:2130 nodo en cualquier lugar, incluido el que está en blanco, puede usar:

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 

Solo los espacios de nombres a los que se hace referencia en XQuery deben especificarse en la cláusula XMLNamespaces.

Puede unirse a otra mesa en función de los ID seleccionados si necesita:

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