2013-09-03 7 views
7

私はXMLコードを持っている:XMLオラクル:複数の子ノードエキス

<begin> 
    <entry> 
     <lastname>gordon</lastname> 
     <NumberList> 
      <number>100</number> 
      <codelist> 
       <code>213</code> 
       <code>214</code> 
      <codelist> 
      <login> 
       <user>user1</user> 
       <user>user2</user> 
      </login> 
     <NumberList> 
     <address> 
      <addresslist>Jl. jalan pelan-pelan ke Bekasi, Indonesia</addresslist> 
     </address> 
    </entry> 
    <entry> 
     <lastname>mark</lastname> 
     <address> 
      <addresslist>Jl. jalan cepet-cepet ke Jakarta, Indonesia</addresslist> 
     </address> 
    </entry> 
</begin> 

私のコード:

FOR r IN (SELECT VALUE(p) col_val, 
       EXTRACT(VALUE(P), '/entry/codelist') AS code, 
       EXTRACT(VALUE(P), '/entry/login') AS login 
      FROM TABLE(XMLSequence(Extract(x,'/begin/entry'))) p) 
LOOP 
    IF r.col_val.existsnode('/entry/lastname/text()') > 0 
    THEN 
     vc_lastname := r.col_val.extract('/sdnEntry/lastname/text()').getstringval(); 
    END IF; 

    IF r.col_val.existsnode('/entry/address/addresslist/text()') > 0 
    THEN 
    vc_address := r.col_val.extract('/sdnEntry/address/addresslist/text()').getstringval(); 
    END IF; 

    IF r.col_val.existsnode('/entry/codelist/id/code/text()') > 0 AND r.col_val.existsnode('/entry/login/user/text()') > 0 
    THEN 
     FOR R1 IN (SELECT EXTRACTVALUE(VALUE(T1), '/codelist/code/text()') AS code 
        FROM TABLE(XMLSEQUENCE(EXTRACT(R.code, '/codelist'))) T1) 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R1.code||' - '||R2.address); 
     END LOOP; 

     FOR R2 IN (SELECT 
         EXTRACTVALUE(VALUE(T1), '/login/user/text()') AS user 
        FROM TABLE(XMLSEQUENCE(EXTRACT(R.address, 'login/'))) T1) 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R2.user||' - '||R2.address); 
     END LOOP; 
    ELSE 
     DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName); 
    END IF; 

私の問題:

:どのようにループ子ノードをへのデータは次のようになりますので、
LastName | Number | code | user | address 
gordon | 100 | 213  | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon | 100 | 213  | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon | 100 | 214  | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon | 100 | 214  | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia 
mark  | Null | null | null |Jl. jalan cepet-cepet ke Jakarta, Indonesia 

助けていただければ幸いです。

+0

[Oracle XML:Skip Not exist Node]の重複可能性があります(http://stackoverflow.com/questions/18583872/oracle-xml-skip-not-exist-node) – user272735

答えて

12

あなたはXMLTable()関数を使用して所望の結果を達成することができます

select q.Lastname 
    , q.Numberid 
    , s.codeid 
    , w.LoginId 
    , q.address 
    from t1 t 
    left join xmltable('/begin/entry' 
         passing t.xml_col 
         columns LastName varchar2(21) path 'lastname', 
           NumberId number  path 'NumberList/number', 
           Address varchar2(201) path 'address/addresslist', 
           CodeList XmlType  Path 'NumberList/codelist/code', 
           Logins  XmlType  Path 'NumberList/login/user' 
        ) q 
    on (1=1) 
    left join xmltable('/code' 
         passing q.CodeList 
         columns CodeId number path '.') s 
    on (1=1) 
    left join xmltable('/user' 
         passing q.Logins 
         columns LoginId varchar2(11) path '.') w 
    on (1=1) 

結果:SQLFiddle Demo

Lastname Numberid Codeid Loginid Address 
--------------------------------------------------------------------------- 
gordon 100  213 user1 Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon 100  213 user2 Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon 100  214 user1 Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon 100  214 user2 Jl. jalan pelan-pelan ke Bekasi, Indonesia 
mark  null  null null Jl. jalan cepet-cepet ke Jakarta, Indonesia 

Find out moreについてXMLTable()機能を。

cursor_sharingパラメータは(11.2から始まる非推奨)FORCEまたはSIMILARに設定されているときにOracleを使用した作業が11.2.0.2より前のリリースでは、XMLクエリの特定の種類のORA-1780 error(バグ8545377)を発生することがあります。 cursor_sharingパラメータをEXACT(デフォルト値)に設定すると、問題が解決されます。

+0

素晴らしいです! – ajmalmhd04

+1

なぜ 'ORA-01780:string literal required'エラーが起きましたか?' alter session set cursor_sharing = exact; 'を設定しなかったのはなぜですか? ?? 11g – ajmalmhd04

+1

を使って私は情報をありがとう!剪断の代わりにあなたが共有を意味することを願って – ajmalmhd04