2017-06-15 7 views
0

XMLメッセージから以下のデータを抽出するために必要なヘルプ。私はclobデータ型でxmlメッセージを含むテーブルを持っています。私は以下のクエリを使用しようとしているが、データを返さない。私はxmlメッセージからすべての値を抽出する必要があります。クロスジョインを使用したSqlクエリXMLTABLE

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

クエリ:

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; 

答えて

0

あなたが名前の名前空間識別子ではなくdefealtを提供する必要があり、そしてあなたのコラムパスが1つのあまりにも多くのレベル上がっている:あなたはおそらく

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; 
そう、ちょうどあなたがに簡素化することができ、メッセージタイプを取得します