简体   繁体   中英

How to do multiple loops through XML in PL/SQL

My XML looks like this

<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>

I would like output:

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

My current code looks like this:

    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;

I would need one more loop inside a row to loop through name tag, but I don't know how to do it.

A little help would be appreciated.

I figured it by myself:

    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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM