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