2015-09-05 46 views
1

我有一個表定義如下嵌套的XML到表

CREATE TABLE "MENU"."ITEMS" (
    "ID" NUMBER NOT NULL ENABLE, 
    "PARENT" NUMBER DEFAULT 0 NOT NULL ENABLE, 
    "OPID" NUMBER DEFAULT 0 NOT NULL ENABLE, 
    "VER" NUMBER DEFAULT 0 NOT NULL ENABLE, 
    "STATUS" NUMBER DEFAULT 0 NOT NULL ENABLE, 
    "RECORD_TIME" TIMESTAMP (9) WITH LOCAL TIME ZONE DEFAULT systimestamp NOT NULL ENABLE, 
    "MODIFIED_TIME" TIMESTAMP (6) DEFAULT systimestamp NOT NULL ENABLE, 
    "VALUE" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
    "TITLE" VARCHAR2(255 BYTE) 
) 

使用XMLGEN我創建的XML如下

<?xml version="1.0" ?> 
<MENU ENCODE="0"> 
    <ITEM VALUE="1" TITLE="test1"> 
     <ITEM VALUE="1" TITLE="test10"/> 
     <ITEM VALUE="2" TITLE="test11"/> 
     <ITEM VALUE="3" TITLE="test12"/> 
    </ITEM> 
    <ITEM VALUE="2" TITLE="test2" > 
     <ITEM VALUE="1" TITLE="test21"/> 
     <ITEM VALUE="2" TITLE="test22"/> 
     <ITEM VALUE="3" TITLE="test23"/> 
     <ITEM VALUE="4" TITLE="test24"/> 
     <ITEM VALUE="5" TITLE="test25"/> 
     <ITEM VALUE="6" TITLE="test26"/> 
    </ITEM> 
    <ITEM VALUE="3" TITLE="test28"> 
     <ITEM VALUE="1" TITLE="test29"/> 
     <ITEM VALUE="2" TITLE="hasan"/> 
    </ITEM> 
    <ITEM VALUE="4" TITLE="test4"/> 
    <ITEM VALUE="5" TITLE="test5"/> 
    <ITEM VALUE="6" TITLE="test6"/> 
    <ITEM VALUE="7" TITLE="test7"/> 
    <ITEM VALUE="8" TITLE="test8"/> 
    <ITEM VALUE="9" TITLE="test9"/> 
</MENU> 

現在我希望能夠導入XML文件像上面和填寫表ITEMS。我嘗試使用xmltable和xmltype一起創建一個關閉xml的表,但問題是我無法使用此方法獲取父/子層次結構。

select * from 
    xmltable('/menu//item' 
    passing xmltype(lower(xmldata)) 
    columns 
     value varchar2(10) path '@value', 
     title varchar2(10) path '@title' 
); 

有什麼辦法可以找到哪個項目是哪個項目的子項?按循環或光標或任何意思。時間消耗不是問題,因爲這將是一項離線工作。此外,這棵樹深入了很多,這裏顯示了兩個以上的級別。

謝謝!

回答

1

這個查詢應該給你填寫表的起點。

select 
    rownum ID, 
    ELEMENT_NAME, PARENT_NAME, VALUE, PARENT_VALUE, TITLE, PARENT_TITLE, ELEMENT_LEVEL 
from 
    xmltable('/menu//item' 
    passing xmltype(lower('<?xml version="1.0" ?> 
<MENU ENCODE="0"> 
    <ITEM VALUE="1" TITLE="test1"> 
     <ITEM VALUE="1" TITLE="test10"/> 
     <ITEM VALUE="2" TITLE="test11"/> 
     <ITEM VALUE="3" TITLE="test12"/> 
    </ITEM> 
    <ITEM VALUE="2" TITLE="test2" > 
     <ITEM VALUE="1" TITLE="test21"/> 
     <ITEM VALUE="2" TITLE="test22"/> 
    </ITEM> 
</MENU>')) 
    columns 
     --FULL_xml XMLType path './..', 
     element_name varchar2(4000) path 'local-name(.)', 
     parent_name varchar2(4000) path './../local-name(.)', 
     value varchar2(10) path '@value', 
     parent_value varchar2(10) path './../@value', 
     title varchar2(10) path '@title', 
     parent_title varchar2(10) path './../@title', 
     element_level number path 'count(ancestor::*)' 
); 

  ID ELEMENT_NAME PARENT_NAME VALUE  PARENT_VALUE TITLE  PARENT_TITLE ELEMENT_LEVEL 
---------- ------------ ----------- ---------- ------------ ---------- ------------ ------------- 
      1 item   menu  1      test1        1 
      2 item   item  1   1   test10  test1     2 
      3 item   item  2   1   test11  test1     2 
      4 item   item  3   1   test12  test1     2 
      5 item   menu  2      test2        1 
      6 item   item  1   2   test21  test2     2 
      7 item   item  2   2   test22  test2     2 

如果父的主鍵必須添加的,但不應該是一個問題,因爲我認爲值,ELEMENT_LEVEL是獨一無二的分配。

+0

這個炒鍋!非常感謝! – Cunning