Oracle Pl/SQL: Loop through XMLTYPE nodes

前端 未结 5 1056
长情又很酷
长情又很酷 2020-12-04 14:38

I have a XMLTYPE with the following content:


    
        
            user1
         


        
相关标签:
5条回答
  • 2020-12-04 15:02
    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;', '>');
    
    0 讨论(0)
  • 2020-12-04 15:03

    You can loop through the elements using EXTRACT and XMLSequence (splits the XML into distinct chunks -- here users) like this:

    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
    
    0 讨论(0)
  • 2020-12-04 15:05
    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 
    
    0 讨论(0)
  • 2020-12-04 15:08

    You can use XQuery. Check out the select statement below. v_xml_doc is the XMLTYPE variable containing the XML data.

    select name
    from   XMLTable('for $i in /users/user
                                return $i'
                                passing   v_xml_doc
                                columns   name varchar2(200) path 'name'
                   )
    
    0 讨论(0)
  • 2020-12-04 15:11

    How about this:

    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;
    
    0 讨论(0)
提交回复
热议问题