Oracle-PLSQL-Einstellung einen cursor aus einer variable
Im neuen Cursor in Oracle. Ich habe ein Stück von SQL enthalten ist, die in eine variable. Ich will öffnen einen cursor, mit diesem sql. Wie mache ich das? Scheint einfach, aber alle Beispiele, die ich finden hab nur die sql eingegeben, die direkt unterhalb der "open cursor_name für" Anweisung.
Hier ist, was ich laufen möchte (angenommen ich habe die variable v_sql mit meiner sql-query):
open my_cursor for v_sql;
Oracle nicht mag, obwohl dies. Ich habe auch versucht
open my_cursor for
execute immediate v_sql;
Hilfe bitte.
- Sie sind riskieren einen injection-Angriff...
- Riskieren, meine Augen. Einladend ist.
- SQL-Injection ist nur ein Risiko, wenn ganze strings übergeben werden kann, um
v_sql
. Es ist völlig sicher zu montieren eine SQL-Abfrage innerhalb einer Prozedur. - "Oracle nicht mag, dieses aber". Zu vage ist. Wir brauchen mehr details. Bitte beschreiben Sie das beobachtete Verhalten und geben Fehlermeldungen an. Poste auch alle Ihren code sowie ein Beispiel für eine Anweisung.
open my_cursor for v_sql;
ist die richtige Nutzung, so muss das problem liegen mit den umliegenden code-Kontext, oder die Anweisung, die Sie ausführen. - Selbst als parameter, die Sie nicht wissen über die syntax/etc Fehler in dynamischem SQL zur Laufzeit. IIRC, es gibt auch ein Risiko der Umgehung von Berechtigungen (SPRICH: LÖSCHEN) durch die Verwendung von dynamischen SQL.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie deklarieren es als einen ref-cursor, und öffnen Sie es dann für die SQL-Anweisung. Bitte schauen Sie sich das Beispiel unten an. Dies ist natürlich vorausgesetzt, Sie haben keinen Eingang Bindungen zu Ihrem sql.
Check diesen link...
http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10807/11_dynam.htm#i13057
Das erste snippet, das Sie funktionieren gut, solange v_sql VARCHAR ist und my_cursor ist deklariert als REF CURSOR. Anschließend können Sie ABRUFEN aus, dass genau wie bei einer static-cursor vor.
Aber als OMG-Ponys, die sagt, Sie müssen vorsichtig sein, wo Sie Ihre SQL kommt.
my_cursor ref cursor;
. Aber ab Oracle 9i gibt es einen eingebauten Typ namensSYS_REFCURSOR
die Sie verwenden können, statt zu deklarieren, Ihre eigene Art zu jeder Zeit. Code, vordatiert 9i haben noch den alten Stil in ihm.OMG Ponies ist völlig richtig,
aber hier ist nur eine andere Art, das gleiche zu tun
Hinweis: wenn Sie nichts tun, in Oracle wie das öffnen von Cursorn, oder was Sie benötigen, um innerhalb eines BEGIN/END und Sie können nicht einfach tun:
Wird das nicht Funktionieren! Sie müssen schließen Sie die GEÖFFNETEN cursor innerhalb eines BEGIN/END-block (sei es eine anonomous block oder eine Prozedur...)
beachten 😡 in der begin/end in der anonomous Blöcke ist zu sagen, die sql-engine, nutzen Sie eine variable außerhalb des Blocks. innerhalb eines packages/procs ist es unnötig.