web-dev-qa-db-ja.com

Oracle Pl / SQL:XMLTYPEノードのループ

次の内容のXMLTYPEがあります。

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

すべての要素「user」を介してPL/SQLでループするにはどうすればよいですか?ありがとう

34
pistacchio

次のようにEXTRACTおよびXMLSequence(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
20
Vincent Malgrat

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'
               )
16
diederikh

これはどう:

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;
12
Fergus McGlynn
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 
1
Trijit