【问题标题】:Oracle Pl/SQL: Loop through XMLTYPE nodesOracle Pl/SQL:循环通过 XMLTYPE 节点
【发布时间】:2010-11-02 10:07:47
【问题描述】:

我有一个包含以下内容的 XMLTYPE:

<?xml version="1.0"?>
    <users>
        <user>
            <name>user1</name>
        </user>
        <user>
            <name>user2</name>
        </user>
        <user>
            <name>user3</name>
        </user>
    </users>

如何在 PL/SQL 中循环遍历所有“用户”元素?谢谢

【问题讨论】:

    标签: xml oracle plsql xmltype


    【解决方案1】:

    您可以使用 EXTRACTXMLSequence 循环遍历元素(将 XML 拆分为不同的块 - 这里是用户),如下所示:

    SQL> SELECT extractvalue(column_value, '/user/name') "user"
      2    FROM TABLE(XMLSequence(XMLTYPE(
      3                 '<?xml version="1.0"?>
      4                     <users>
      5                         <user>
      6                             <name>user1</name>
      7                         </user>
      8                         <user>
      9                             <name>user2</name>
     10                         </user>
     11                         <user>
     12                             <name>user3</name>
     13                         </user>
     14                     </users>').extract('/users/user'))) t;
    
    user
    --------
    user1
    user2
    user3
    

    【讨论】:

      【解决方案2】:

      您可以使用 XQuery。查看下面的选择语句。 v_xml_doc 是包含 XML 数据的 XMLTYPE 变量。

      select name
      from   XMLTable('for $i in /users/user
                                  return $i'
                                  passing   v_xml_doc
                                  columns   name varchar2(200) path 'name'
                     )
      

      【讨论】:

        【解决方案3】:

        这个怎么样:

        PROCEDURE xmltest IS
          v_userlist XMLType;
          v_count NUMBER(38) := 1;
        BEGIN
          /* define XML variable */
          v_userlist := XMLType('<?xml version="1.0"?>
            <users>
                <user>
                    <name>user1</name>
                </user>
                <user>
                    <name>user2</name>
                </user>
                <user>
                    <name>user3</name>
                </user>
            </users>');
        
          /* for each user, print out their name (each element can be extracted using xpath '//user[1]' '//user[2]' etc) */
          WHILE v_userlist.existsNode('//user[' || v_count || ']') = 1 LOOP
            dbms_output.put_line(v_userlist.extract('//user[' || v_count || ']/name/text()').getStringVal());
            v_count := v_count + 1;
          END LOOP;
        END;
        

        【讨论】:

          【解决方案4】:
          select xt.* from xmltable('/users/user' passing xmltype('<users>
              <user>
                  <name>user1</name>
              </user>
              <user>
                  <name>user2</name>
              </user>
              <user>
                  <name>user3</name>
              </user>
          </users>') columns name varchar2(10) path 'name' ) xt 
          

          【讨论】:

            【解决方案5】:
            ITS VERY GOOD!!
            
            CADENA   CLOB;
            BEGIN
               SELECT CASE
                         WHEN EXISTSNODE (:NEW.MENSAJE, '/Body') <> 0 THEN 'ERROR'
                         ELSE NULL
                      END
                 INTO :NEW.DESCRIPCION_ERROR
                 FROM DUAL;
            
               CADENA := :NEW.MENSAJE.EXTRACT ('/Body/xmlOriginal/text()').getStringVal ();
               CADENA := REPLACE (CADENA, '&lt;', '<');
               CADENA := REPLACE (CADENA, '&gt;', '>');
            

            【讨论】:

              猜你喜欢
              • 2017-09-16
              • 1970-01-01
              • 2019-06-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多