简体   繁体   中英

Sql query with cross join XMLTABLE

Help needed to extract the data below from XML messages. I have table which contains the xml message in clob data type. I am trying using below query but it is not returning any data . I need to extract all the values from xml message.

<iORDERS:iORDERS xmlns:iORDERS="urn:iORDERS-abcdonline-com:Integration:v1">
<ORDER_NOTIFY>
<MESSAGE_DATETIME>2017-06-13T12:20:51+10:00</MESSAGE_DATETIME>
<MESSAGE_SEQ>1</MESSAGE_SEQ>
<MESSAGE_TYPE>PLACED</MESSAGE_TYPE>
<ORDER_HEAD>
<ORDER_ID>1111</ORDER_ID>
<DROP_SHIP_ORDER_NO></DROP_SHIP_ORDER_NO>
<CUSTOMER_ORDER_NO>22222</CUSTOMER_ORDER_NO>
<DISPATCH_LOCATION>
<SKU>2323234</SKU>
<UPC>4549432533626</UPC>
<REQUESTED_QTY>1</REQUESTED_QTY>
<DISPATCH_ASSIGNMENT>7777</DISPATCH_ASSIGNMENT>
<PROVIDER_ID>100</PROVIDER_ID>
<PKG_TYPE>SAT</PKG_TYPE>
</DISPATCH_LOCATION>
</ORDER_HEAD>
</ORDER_NOTIFY>
</iORDERS:iORDERS>

query :

select wor.batch_no,wor.web_service_no,x.*
  from web_orders wo
    cross join XMLTABLE (
          XMLNAMESPACES(DEFAULT 'urn:iORDERS-abcdonline-com:Integration:v1'),
           'iORDERS/ORDER_NOTIFY/ORDER_HEAD/DISPATCH_LOCATION'
            passing xmltype(wo.xml_message)
          columns    
          MESSAGE_TYPE varchar(120) path './../../../MESSAGE_TYPE') x;

You need to provide the named namespace identifier rather than a defealt, and your column path is going up one too many levels:

select wo.batch_no,wo.web_service_no,x.*
  from web_orders wo
    cross join XMLTABLE (
          XMLNAMESPACES('urn:iORDERS-abcdonline-com:Integration:v1' as "iORDERS"),
           'iORDERS:iORDERS/ORDER_NOTIFY/ORDER_HEAD/DISPATCH_LOCATION'
            passing xmltype(wo.xml_message)
          columns    
          MESSAGE_TYPE varchar(120) path './../../MESSAGE_TYPE') x;

  BATCH_NO WEB_SERVICE_NO MESSAGE_TYPE                                                                                                            
---------- -------------- ------------------------------------------------------------------------------------------------------------------------
         1              2 PLACED                                                                                                                  

Presumably you're planning on getting for information that that from the XML, and/or expect to have multiple nodes; otherwise, to just get the message type you could simplify to:

select wo.batch_no,wo.web_service_no,x.*
  from web_orders wo
    cross join XMLTABLE (
          XMLNAMESPACES('urn:iORDERS-abcdonline-com:Integration:v1' as "iORDERS"),
           'iORDERS:iORDERS/ORDER_NOTIFY'
            passing xmltype(wo.xml_message)
          columns    
          MESSAGE_TYPE varchar(120) path 'MESSAGE_TYPE') x;

or even, with a single node:

select wo.batch_no,wo.web_service_no,XMLQuery(
  'declare namespace iORDERS="urn:iORDERS-abcdonline-com:Integration:v1"; (: :)
    iORDERS:iORDERS/ORDER_NOTIFY/MESSAGE_TYPE/text()'
  passing xmltype(wo.xml_message)
  returning content).getStringVal() as message_type
from web_orders wo;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM