Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wybrać konkretną nazwę węzła i jego wartości w XML za pomocą zapytania Oracle SQL?

Możesz przekonwertować swój CLOB na XMLType, zakładając, że jest poprawny, za pomocą:

extractvalue(XMLType(RESPONSE_XML), ...

Nie jestem pewien, dlaczego typ Twojej kolumny nie jest typem XMLType, jeśli przechowujesz w nim XML, ale nie jest to do końca istotne.

Następnie możesz podać przestrzeń nazw do 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';

.. ale masz wiele identyfikatorów, więc otrzymujesz:ORA-19025: EXTRACTVALUE returns value of only one node .

I extractvalue jest przestarzałe, jak wspomniano w dokumentacji

Możesz użyć XQuery zamiast tego, konkretnie tutaj XMLTable.

Zakładając, że chcesz tylko ax2130:id wartości zagnieżdżone w ax2147:subscription , możesz użyć tego 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 

Lub jeśli chcesz dowolny ax:2130 węzeł w dowolnym miejscu, w tym pusty, możesz użyć:

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 

Tylko przestrzenie nazw, o których mowa w XQuery, muszą być określone w klauzuli XMLNamespaces.

Możesz dołączyć do innego stołu na podstawie wybranych identyfikatorów, jeśli chcesz:

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. Odbiór zwrotów z funkcji pakietowej do użytku w select

  2. Gdzie są moje łatki?

  3. Oracle SQL :znaczniki czasu w klauzuli gdzie

  4. Oracle ORA-00979 — nie jest wyrażeniem GROUP BY

  5. Jak rozwiązać ORA-00937:nie funkcja pojedynczej grupy przy obliczaniu procentu?