2013-08-31 32 views
4

我的XML看起來像這樣如何做到通過XML多重循環在PL/SQL

<data> 
    <row> 
     <id>1</id> 
     <name>John</name> 
     <name>Jack</name> 
    </row> 
    <row> 
     <id>2</id> 
     <name>Scott</name> 
     <name>Chuck</name> 
     <name>Kim</name> 
    </row> 
</data> 

我想輸出:

->1 
-->John 
-->Jack 
->2 
-->Scott 
-->Chuck 
-->Kim 

我當前的代碼如下所示:

DECLARE 
     X XMLTYPE := XMLTYPE('<?xml version="1.0" ?> 
    <data> 
     <row> 
      <id>1</id> 
      <name>John</name> 
      <name>Jack</name> 
     </row> 
     <row> 
      <id>2</id> 
      <name>Scott</name> 
      <name>Chuck</name> 
      <name>Kim</name> 
     </row> 
    </data>'); 
    BEGIN 
     FOR R IN (SELECT EXTRACTVALUE(VALUE(P), '/row/id/text()') AS NAME 

        FROM TABLE(XMLSEQUENCE(EXTRACT(X, '//data/row'))) P) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE('-->' || R.NAME); 
     END LOOP; 
    END; 

我需要一個循環內循環通過名稱標籤,但我不知道如何去做。

有一點幫助,將不勝感激。

回答

6

我想它通過自己:

DECLARE 
     X XMLTYPE := XMLTYPE('<?xml version="1.0" ?> 
    <data> 
     <row> 
      <id>1</id> 
      <promet> 
      <name>John</name> 
      <name>Jack</name> 
      </promet> 
     </row> 
     <row> 
      <id>2</id> 
      <promet> 
      <name>Scott</name> 
      <name>Chuck</name> 
      <name>Kim</name> 
      </promet> 
     </row> 
    </data>'); 
    BEGIN 
     FOR R IN (SELECT EXTRACTVALUE(VALUE(P), '/row/id/text()') AS ID, 
         EXTRACT(VALUE(P), '/row/promet') AS PROMET 
        FROM TABLE(XMLSEQUENCE(EXTRACT(X, '//data/row'))) P) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE('-->' || R.ID); 
      FOR R1 IN (SELECT EXTRACTVALUE(VALUE(T1), '/name/text()') AS NAME 
         FROM TABLE(XMLSEQUENCE(EXTRACT(R.PROMET, 'promet/name'))) T1) 
      LOOP 
      DBMS_OUTPUT.PUT_LINE('-->' || R1.NAME); 
      END LOOP; 
     END LOOP; 
    END;