2013-04-21 35 views
0

我有一個XML存儲在名爲XML_TABLE的表中的XMLTYPE列中,名稱爲xml_file。我正在使用Oracle 11g r2。使用PL/SQL將XML解析/關聯到關係表中

<ROWSET> 
<DEPARTMENT> 
    <DEPARTMENT_ID>DEP22681352268280797</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>myDEPARTMENT</DEPARTMENT_NAME> 
    <SECTIONS_ID>6390135666643567</SECTIONS_ID> 
    <SECTIONS_NAME>mySection</SECTIONS_NAME> 
</DEPARTMENT> 
<DEPARTMENT> 
    <DEPARTMENT_ID>DEP255555555550797</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>myDEPARTMENT2</DEPARTMENT_NAME> 
    <SECTIONS_ID>63901667779243567</SECTIONS_ID> 
    <SECTIONS_NAME>mySection2</SECTIONS_NAME> 
</DEPARTMENT> 
</ROWSET> 

我希望將這些值插入到兩個表是部門和sections.How打算在PL/SQL來實現這一點。 我曾嘗試使用提取功能,但我只是讀它不再推薦,因此尋求幫助。此外,我不知道我將如何迭代XML值..cursor ... ??

+0

哪個版本的Oracle? – APC 2013-04-21 21:16:57

+0

@APC Oracle 11G r2 – 2013-04-21 21:27:46

+0

你可以取悅你預期的表格和關係,PK,FK等? – OldProgrammer 2013-04-21 21:58:52

回答

1

使用XQuery將XML文檔分成有趣的數據塊。使用XMLTable表示這些塊,以獲得可以在SQL中使用的內容。 (這顯然是粗糙的,你沒有發佈表結構,但我假設SECTIONS有一個DEPARTMENTS的外鍵)。您應該閱讀文檔to find out more

insert all 
    into departments 
     values (dept_id, dept_name) 
    into sections 
     values (dept_id, sect_id, sect_name) 
select dept.id as dept_id 
     , dept_name as dept_name 
     , sect.id as sect_id 
     , sect.name as sect_name 
from your_table 
    , xmltable('/ROWSET/DEPARTMENT' 
       passing your_table.xml_col 
       columns 
        "ID" varchar2(30) path 'DEPARTMENT_ID' 
        , "NAME" varchar2(30) path 'DEPARTMENT_NAME' 
      ) dept 
    , xmltable('/ROWSET/SECTION' 
       passing your_table.xml_col 
       columns 
        "ID" varchar2(30) path 'SECTION_ID' 
        , "NAME" varchar2(30) path 'SECTION_NAME' 
      ) sect 

順便提及,DEPARTMENT 的重複吸入。 XML是一個痛苦的工作,但至少它支持分層數據結構。如果您不打算使用它來避免重複,那麼您最好使用CSV。無論如何,由於發佈的XML不包含任何實際的重複,因此解決其缺陷是作爲讀者的練習。