getstringval - xml getclobval oracle
Oracle Pl/SQL: bucle a través de nodos XMLTYPE (5)
Tengo un XMLTYPE con el siguiente contenido:
<?xml version="1.0"?>
<users>
<user>
<name>user1</name>
</user>
<user>
<name>user2</name>
</user>
<user>
<name>user3</name>
</user>
</users>
¿Cómo puedo iterar en PL / SQL a través de todos los elementos "usuario"? Gracias
Puede recorrer los elementos utilizando EXTRACT
y XMLSequence
(divide el XML en fragmentos distintos, aquí los usuarios) de esta manera:
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
Puedes usar XQuery. Echa un vistazo a la declaración de selección a continuación. v_xml_doc es la variable XMLTYPE que contiene los datos XML.
select name
from XMLTable(''for $i in /users/user
return $i''
passing v_xml_doc
columns name varchar2(200) path ''name''
)
Qué tal esto:
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;
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, ''>'', ''>'');
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