Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да изберете конкретно име на възел и неговите стойности в XML с помощта на Oracle SQL заявка?

Можете да конвертирате своя CLOB в XMLType, ако приемем, че е валиден, само с:

extractvalue(XMLType(RESPONSE_XML), ...

Не съм сигурен защо вашият тип колона не е XMLType, ако съхранявате XML в нея, но това не е напълно уместно.

След това можете да предоставите пространството от имена на 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';

.. но имате множество идентификатори, така че получавате:ORA-19025: EXTRACTVALUE returns value of only one node .

И extractvalue е отхвърлено, както е отбелязано в документацията

Можете да използвате XQuery вместо това, конкретно тук XMLTable.

Ако приемем, че искате само ax2130:id стойности, вложени в ax2147:subscription , можете да използвате този 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 

Или ако искате ax:2130 възел навсякъде, включително празния, можете да използвате:

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 

Само пространствата от имена, посочени в XQuery, трябва да бъдат посочени в клаузата XMLNamespaces.

Можете да се присъедините към друга маса въз основа на избраните идентификатори, ако трябва:

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. Как да промените отрицателната стойност на положителна в Oracle?

  2. Oracle 11g ado свързващи низове за ODBC (не OLEDB), използвайки excel VBA 64 бита (DSN Less и tnsnames)

  3. Доктрина 2:каскадно продължаване Oracle IDENTITY връща 0 като последно вмъкнат идентификатор

  4. как да комбинирате две различни стойности от една таблица на един клиент в един ред

  5. как да извикате функция в plsql функция