Dynamisch hinzufügen der where-Klausel, um einen cursor in oracle
Habe ich plsql-Verfahren, die akzeptiert, dass bestimmte Parameter, z.B. v_name, v_country, v_type.
Wünsche ich mir einen cursor mit einer select-Anweisung wie folgt aus:
select column from table1 t1, table2 t2
where t1.name = v_name
and t1.country = v_country
and t1.id = t2.id
and t2.type = v_type
Wenn bestimmte Parameter leer sind, kann ich nur hinzufügen, die entsprechenden where-Klauseln auf den cursor? Oder gibt es einen besseren Weg, dies zu erreichen?
InformationsquelleAutor Trigger | 2008-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, um dieses ist mit DBMS_SQL.
Erstellen Sie eine Zeichenfolge für die SQL-Anweisung. Sie weiterhin verwenden Sie bind-Variablen. Es ist ein schmerzhafter Prozess.
Es geht so etwas (habe ich noch nicht zusammengestellt, aber es sollte in der Nähe sein) :-
Dieser Ansatz ist so schmerzhaft, im Vergleich zu einfach nur zu schreiben die SQL-inline ist, es sei denn, Sie haben haufenweise Spalten manchmal ist es einfach leichter, zu schreiben ein paar verschiedene Versionen die Verwendung dieser syntax:
InformationsquelleAutor WW.
Eine Möglichkeit wäre, Baue deine Abfrage als string, dann verwenden Sie execute immediate
InformationsquelleAutor hamishmcn
Ist es nicht direkt, was du fragst, aber es kann eine akzeptable Lösung:
Dies kann dazu führen, schlechte Pläne erzeugt durch Oracle. Denken Sie daran, es geht um einen plan für diese Aussage. Es geht um Probleme mit Indizes auf t2.Typ oder t1.name.
InformationsquelleAutor
Den besten Weg, dies zu tun wäre die Nutzung von Oracle ' s Applikations-Kontext-feature, am besten definiert als die beste Leistung und Sicherheit.
Den schneller Weg wäre, was hamishmcn vorgeschlagen, mit EXECUTE IMMEDIATE. Ich würde wählen, dass über der WW-Vorschlag von DBMS_SQL jedes mal.
Andere Art und Weise, dass Schnellste zu schreiben aber nicht so gut wäre so etwas wie dieses:
InformationsquelleAutor Stew S
Haben Sie nicht verwenden dbms_sql um dieses problem zu lösen
und dennoch kann man die normalen cursor über einen ref-cursor.
Beispiel:
Können Sie diese besser durch Bindung der Variablen mit dem Befehl 'verwenden' wie diese:
InformationsquelleAutor Edwin