带有交叉连接XMLTABLE的SQL查询

时间:2017-06-15 10:45:44

标签: sql xml oracle

需要帮助从XML消息中提取以下数据。我有一个表,其中包含clob数据类型中的xml消息。我正在尝试使用下面的查询,但它没有返回任何数据。我需要从xml消息中提取所有值。

setState

查询:

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

1 个答案:

答案 0 :(得分:0)

您需要提供命名的命名空间标识符而不是失败,并且您的列路径上升了太多级别:

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                                                                                                                  

据推测,您计划从XML获取信息,和/或期望拥有多个节点;否则,只需获取您可以简化的消息类型:

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;

甚至是单个节点:

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;
相关问题