2017-06-29 33 views
0

我有一個存儲xml的Oracle DB CLOB字段。我需要使用DistributionNbr標記檢索所有xml中的所有值我已經對以下查詢使用了相同的參數,併爲ref提供了一個示例xml。從定界符分隔的oracle db中提取clob的值

select extract(xmltype(column_name),'//*/xmlpath/text()').getStringval() as g 
from table; 
<xml> 
<ShipConfirm> 
<ShipmentID>000000196</ShipmentID> 
</ShipConfirm> 
<ShipConfirm> 
<ShipmentID>000000197</ShipmentID> 
</ShipConfirm> 
<ShipConfirm> 
<ShipmentID>000000198</ShipmentID> 
</ShipConfirm> 
</xml> 

現在我得到的值作爲一個字符串:000000196000000197000000198

我需要在下一行逗號分隔值或值。 000000196,000000197,000000198

OR

000000196 
000000197 
000000198 

回答

0

請避免不必要的「//」,運營商...和列圖案隱含相對於行模式

SQL> with MY_TABLE as 
    2 (
    3 select 1 as PRIMARY_KEY, 
    4   XMLTYPE(
    5 '<xml> 
    6 <ShipConfirm> 
    7  <ShipmentID>000000196</ShipmentID> 
    8 </ShipConfirm> 
    9 <ShipConfirm> 
10  <ShipmentID>000000197</ShipmentID> 
11 </ShipConfirm> 
12 <ShipConfirm> 
13  <ShipmentID>000000198</ShipmentID> 
14  </ShipConfirm> 
15 </xml>') as XML_DOC 
16  from DUAL 
17 ) 
18 SELECT LISTAGG(x.ShipmentID, ',') WITHIN GROUP (ORDER BY idx) AS ShipmentIDs 
19 FROM MY_TABLE t, 
20   XMLTABLE(
21   '/xml/ShipConfirm' 
22   PASSING XML_DOC 
23   COLUMNS 
24    idx FOR ORDINALITY, 
25    ShipmentID CHAR(9) PATH 'ShipmentID' 
26  ) x 
27 GROUP BY t.primary_key 
28/

SHIPMENTIDS 
-------------------------------------------------------------------------------- 
000000196,000000197,000000198 

SQL> 
SQL> 
+0

查看LIVESQL在這裏https://livesql.oracle.com/apex/livesql/file/content_E7E0NODMZ5BTXA3BXNF2XFB14.html –

+0

非常感謝你 – jabbars

0

使用XMLTABLE

SELECT x.ShipmentID 
FROM your_table t 
     CROSS JOIN 
     XMLTABLE(
     '//xml/ShipConfirm' 
      PASSING XMLTYPE(t.column_name) 
      COLUMNS ShipmentID CHAR(9) PATH './ShipmentID' 
     ) x; 

這將在行其返回。

如果你想把它當作逗號分隔值那麼你可以使用:

SELECT LISTAGG(x.ShipmentID, ',') WITHIN GROUP (ORDER BY idx) 
     AS ShipmentIDs 
FROM your_table t 
     CROSS JOIN 
     XMLTABLE(
     '//xml/ShipConfirm' 
      PASSING XMLTYPE(t.column_name) 
      COLUMNS ShipmentID CHAR(9) PATH './ShipmentID', 
        idx FOR ORDINALITY 
     ) x 
GROUP BY t.primary_key; 
+0

在oracle中,CROSS JOIN不是必需的。在由表函數(XMLTABLE)生成的行與爲表函數提供輸入的行之間存在隱式橫向連接。 –

+0

@markddrake您需要一個逗號(其在WHERE條件中沒有過濾器,與傳統Oracle連接語法中的CROSS JOIN等價)或ANSI連接語法中的CROSS JOIN。我只是使用'CROSS JOIN'作爲ANSI語法,而不是恢復到傳統語法。 – MT0

相關問題