2016-12-02 133 views
0

我有這個示例xml我的需求是解析它並從它的各個節點獲取值並將它們插入到oracle表之一中。將xml導入到oracle數據庫表

<?xml version="1.0" encoding="UTF-8"?> 
<Reporting> 
    <Selection>69</Selection> 
    <MonthEndDate>9/30/2016</MonthEndDate> 
    <Email> 
     <Name>abc</Name> 
     <Address>[email protected]</Address> 
    </Email> 
    <Request> 
     <Port_id_list> 
      <Port_id>1901</Port_id> 
      <Port_id>1902</Port_id> 
      <Port_id>1903</Port_id> 
     </Port_id_list> 
    </Request> 
</Reporting> 

我們該怎麼做? 請幫忙。

回答

1

EDITED

例如:

WITH my_data AS 
(SELECT xmltype('<?xml version="1.0" encoding="UTF-8"?> 
<Reporting> 
    <Selection>69</Selection> 
    <MonthEndDate>9/30/2016</MonthEndDate> 
    <Email> 
     <Name>abc</Name> 
     <Address>[email protected]</Address> 
    </Email> 
    <Request> 
     <Port_id_list> 
      <Port_id>1901</Port_id> 
      <Port_id>1902</Port_id> 
      <Port_id>1903</Port_id> 
     </Port_id_list> 
    </Request> 
</Reporting>') my_xml 
    FROM dual) 
SELECT extractValue(md.my_xml, 'Reporting/Selection/text()') selection_id, 
     extractValue(value(port_ids), 'Port_id/text()') port_id 
    FROM my_data md, 
     TABLE(XMLSequence (md.my_xml.extract ('Reporting/Request/Port_id_list/Port_id'))) port_ids; 

如果XML節點有兒童創建一個一對多的桌子和和XMLSequence。

+0

對於單節點它工作,但對於多個序列它是拋出錯誤。當我使用路徑爲c_port_id varchar2(4000)PATH'請求/ Port_id_list/Port_id /文本()'給我錯誤預計單身序列有多個序列。 – yatinbc

+0

等幾分鐘我通過XMLSequence運算符給你例子 – hinotf

1

應該優選使用XMLTABLE作爲對extractValue是deprecate d

這裏的示例選擇與(規格化)parten屬性TEH端口。 我也添加了posr序列來保存端口的順序。

WITH t AS 
(SELECT xmltype('<?xml version="1.0" encoding="UTF-8"?> 
<Reporting> 
    <Selection>69</Selection> 
    <MonthEndDate>9/30/2016</MonthEndDate> 
    <Email> 
     <Name>abc</Name> 
     <Address>[email protected]</Address> 
    </Email> 
    <Request> 
     <Port_id_list> 
      <Port_id>1901</Port_id> 
      <Port_id>1902</Port_id> 
      <Port_id>1903</Port_id> 
     </Port_id_list> 
    </Request> 
</Reporting>') xml 
    FROM dual) 
select 
x.Selection,x.MonthEndDate,x.emailName, x.emailAddress, 
o.port_seq, o.port_id 
from t, 
     XMLTable(
      'for $i in /Reporting  
      return $i' 
      passing t.xml 
      columns 
       Selection varchar2(30) path 'Selection', 
       MonthEndDate varchar2(30) path 'MonthEndDate', 
       emailName varchar2(30) path 'Email/Name', 
       emailAddress varchar2(30) path 'Email/Address', 
       Port_id_list XMLType path '//Port_id' 
       ) x, 
     XMLTable(
      './Port_id' 
      passing (x.Port_id_list) 
      columns 
       port_seq for ordinality, 
       port_id varchar2(30) path '/Port_id' 
       ) o     
; 

SELECTION      MONTHENDDATE     EMAILNAME      EMAILADDRESS      PORT_SEQ PORT_ID      
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ------------------------------ 
69        9/30/2016      abc       [email protected]       1 1901       
69        9/30/2016      abc       [email protected]       2 1902       
69        9/30/2016      abc       [email protected]       3 1903