Oracle extrahieren Werte aus xmltype
Dies ist der code den ich momentan verwende:
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;
/
Den oben genannten code verwendet xml zu extrahieren und speichern Sie die vorhandene node-Werte zu bestimmten lokalen Variablen. Es ist verwendet worden, in dem Fall für mehrere Daten-sets und ist in Ordnung. Ich wollte nur wissen, ob kann ich in der Lage, verwenden Sie die gleichen ohne "x-loop", weil ich nur eine haben, die Daten in der i_xml ab jetzt und ich werde nur noch entweder
name
oder age
tags .
Sollte der folgende code verwendet werden, zum speichern in l_name oder l_age ohne den "loop" - Methode, wie ich oben verwendet:
<ROWSET>
<ROW>
<name>aa</name>
</ROW>
</ROWSET>
oder
<ROWSET>
<ROW>
<age>18</age>
</ROW>
</ROWSET>
/
Und ich habe versucht, mit der folgenden:
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;
/
Eine bessere Möglichkeit wird sehr geschätzt.. Danke
InformationsquelleAutor ajmalmhd04 | 2013-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du wirklich sicher, dass Sie nur eine
ROW
dann können Sie tun:Dass es funktionieren wird, wenn Sie
name
oderage
oder beides, oder keines von beiden (wobei "funktionieren" bedeutet nicht Fehler, zumindest). Wenn Sie haben mehr als eine Zeile, es würde verketten der Ergebnisse, so dass Sie mit Ihren original-Datenl_name
wäreaabbb
, undl_age
wäre2025
. Die vielleicht nicht, was Sie erwarten.Sie konnte tun
where (l_name is not null and name = l_name) or (l_age is not null and age = l_age)
vermeidet implizite Datentyp-Konvertierung; oder ändern Sie dieend if; if
in der Mitte des Blocks obenelsif
und haben beide Teile weisen die gleichen string-variable.ja.. Das gleiche schon getan. Prost 🙂 !! Alles scheint jetzt in Ordnung.
InformationsquelleAutor Alex Poole