【问题标题】:How to do multiple loops through XML in PL/SQL如何在 PL/SQL 中通过 XML 进行多次循环
【发布时间】:2013-09-03 21:34:36
【问题描述】:

我的 XML 看起来像这样

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

我需要在一行中再循环一个循环来遍历名称标签,但我不知道该怎么做。

我们将不胜感激。

【问题讨论】:

    标签: sql xml oracle plsql


    【解决方案1】:

    我自己想出来的:

        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;
    

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2017-09-16
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2023-03-19
      • 2014-06-19
      相关资源
      最近更新 更多