recorrer read getstringval extractvalue example ejemplos descomponer oracle plsql extract xmltype

read - recorrer xmltype oracle



Oracle extrae valores de xmltype (1)

Si realmente está seguro de que solo tendrá un ROW , puede hacer:

begin l_xml := xmltype(i_xml); if l_xml.existsnode(''/ROWSET/ROW/name'') > 0 then l_name := l_xml.extract(''/ROWSET/ROW/name/text()'').getstringval(); end if; if l_xml.existsnode(''/ROWSET/ROW/age'') > 0 then l_age := l_xml.extract(''/ROWSET/ROW/age/text()'').getnumberval(); end if; end;

Eso funcionará si tiene name o age , o ambos, o ninguno (donde ''trabajo'' significa que no falla, al menos). Si tuviera más de una fila, concatenaría los resultados, así que con sus datos originales, l_name sería aabbb , e l_age sería 2025 . Que podría no ser lo que esperas.

Este es el código que estoy usando actualmente:

SET serveroutput ON CREATE OR REPLACE PROCEDURE test_proc(i_xml varchar2) IS l_name VARCHAR2(20); l_age NUMBER; l_xml xmltype; BEGIN l_xml := xmltype(i_xml); FOR x IN (SELECT VALUE(p) col_val FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml, ''/ROWSET/ROW''))) p ) LOOP IF x.col_val.existSNode(''/ROW/name/text()'') > 0 THEN l_name:= x.col_val.EXTRACT(''/ROW/name/text()'').getstringVal(); END IF; IF x.col_val.existSNode(''/ROW/age/text()'') > 0 THEN l_age := x.col_val.EXTRACT(''/ROW/age/text()'').getstringVal(); END IF; end loop; end; / BEGIN test_proc(''<ROWSET> <ROW> <name>aa</name> <age>20</age> </ROW> <ROW> <name>bbb</name> <age>25</age> </ROW> </ROWSET>''); END; /

El código anterior utiliza xml para extraer y guardar los valores de nodo existentes en variables locales particulares. Se ha utilizado en el caso para múltiples conjuntos de datos y funciona bien. Solo quería saber si puedo usar el mismo sin "for x loop", porque a partir de ahora solo tendré un dato en el i_xml y solo tendré etiquetas de name o age .

El siguiente código se debe usar para guardar en l_name o l_age sin el método de "bucle" como he usado anteriormente:

<ROWSET> <ROW> <name>aa</name> </ROW> </ROWSET>

o

<ROWSET> <ROW> <age>18</age> </ROW> </ROWSET>

/ Y he intentado usar lo siguiente:

SELECT CASE WHEN VALUE(p).existsNode(''/ROW/name/text()'') = 1 THEN p.EXTRACT(''/ROW/name/text()'').getstringVal() WHEN VALUE(P).existsNode(''/ROW/age/text()'') = 1 THEN p.EXTRACT(''/ROW/age/text()'').getstringVal() END INTO l_new FROM TABLE(xmlsequence(EXTRACT(l_xml, ''/ROWSET/ROW''))) p;

/ Cualquier forma mejor es apreciada .. Gracias