오라클 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에서 어떻게 루프를 수행할 수 있습니까?감사해요
해결책
다음을 사용하여 요소를 반복할 수 있습니다. 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
다른 팁
XQuery를 사용할 수 있습니다. 아래의 select 문을 확인하십시오. 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'
)
이건 어때:
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;
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
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, '<', '<');
CADENA := REPLACE (CADENA, '>', '>');
제휴하지 않습니다 StackOverflow