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

Schreibe einen Kommentar