2017-06-16 4 views
0

Ich habe eine Tabelle tsk mit 2 Spalten: eine Task-ID in Nummer und eine Aufgabe Umfang in XMLTYPE, die wie sein:Orakel XMLEXISTS mit variabler Pfad

<scope> 
    <siteCode>2</siteCode> 
    <supplierCode>1111</supplierCode> 
    <contractCode>464</contractCode> 
    <orderNumber>85235478</orderNumber> 
</scope> 

Aber die Elemente unter dem Tag variiert von Ein Datensatz zu einem anderen

Ich muss Task IDs auswählen, die einige Bedingungen im Bereich übereinstimmen. Zum Beispiel:

select tskid 
from tsk t 
where xmlexists('$a/scope[siteCode = 2 and supplierCode = 111]' passing t.tskscope as "a"); 

Da der Umfang variieren kann, habe ich eine PL/SQL-Funktion, um einen XML-Pfad p_xmlpath zu suchen, in varchar2 Art nehmen. So zum Beispiel wird p_xmlpath sein:

p_xmlpath := 'scope[siteCode = 2 and supplierCode = 1111]'; 

Dann möchte ich die Abfrage mit XMLEXISTS ausführen, um die passenden Datensätze zu finden. Ich dachte, es mit Bind-Variablen in der folgenden Art und Weise zu tun:

select tskid 
from tsk t 
where xmlexists('$a/$b' passing t.tskscope as "a", p_xmlpath as "b"); 

dies Dadurch gibt die Abfrage alle Datensätze, ohne den Zustand mit XMLEXISTS zu nehmen.

Weiß jemand, wie man das bewerkstelligt, d. H., Einen variablen Pfad zu XMLEXISTS zu haben?

Zusatzinfo: Bisher habe ich die Funktion existsNode und die folgende Abfrage, um den Job richtig tat:

select tskid 
from tsk t 
where existsnode(t.tskscope, p_xmlpath) = 1; 

Aber einerseits existsNode veraltet ist und auf der anderen Seite bemerkte ich, dass die in meiner Situation Funktion xmlexists war merklich schneller als existsNode, deshalb würde ich zu xmlexists wechseln.

Vielen Dank im Voraus.

Antwort

0

Ich glaube nicht, dass Sie können; Es scheint nur zu erlauben, dass die Suchwerte Variablen sind, nicht die gesamte Suchbedingung.

Als Abhilfe können Sie die XPath bei runtome mit replace() bauen konnte:

select tskid 
from tsk t 
where xmlexists(replace('$a/$b', '$b', p_xmlpath) passing t.tskscope as "a"); 

oder bauen die XPath-Zeichenfolge als eine Variable, wenn Sie lieber nicht dort haben ersetzen und umfassen die $a/ Teil:

p_xmlpath := '$a/' || p_xmlpath; 

select tskid 
from tsk t 
where xmlexists(p_xmlpath passing t.tskscope as "a"); 
+0

Danke! Ich habe die Lösung mit der Definition des gesamten Pfades als Variable versucht und es gibt mir die richtigen Ergebnisse. Leider ist die Abfrage 200-mal länger als wenn ich es mit dem gleichen Pfad in einer Literal-Zeichenfolge ausführen würde, warum nicht ... – cbe