36 Stimmen

Oracle Pl/SQL: Schleife durch XMLTYPE-Knoten

Ich habe einen XMLTYPE mit dem folgenden Inhalt:

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

Wie kann ich in PL/SQL eine Schleife durch alle Elemente "user" ziehen? Danke

20voto

Vincent Malgrat Punkte 65127

Sie können eine Schleife durch die Elemente mit EXTRACT y XMLSequence (zerlegt das XML in einzelne Teile - hier Benutzer) wie folgt:

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

16voto

diederikh Punkte 25146

Sie können XQuery verwenden. Sehen Sie sich die folgende Select-Anweisung an. v_xml_doc ist die XMLTYPE-Variable, die die XML-Daten enthält.

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

13voto

Fergus McGlynn Punkte 131

Wie wäre es damit:

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;

1voto

Trijit Punkte 491
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

-2voto

cetor007 Punkte 1
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;', '>');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X