Warum kann ich nicht mit bind-Variablen in DDL/SCL-statements in dynamic SQL?
Ich versuche zum ausführen einer SQL-Befehl in dynamischen SQL mit bind-Variablen:
-- this procedure is a part of PL/SQL package Test_Pkg
PROCEDURE Set_Nls_Calendar(calendar_ IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE
'ALTER SESSION
SET NLS_CALENDAR = :cal'
USING IN calendar_;
END Set_Nls_Calendar;
Dann auf der client-Seite, ich versuche zu aufrufen der Prozedur:
Test_Pkg.Set_Nls_Calendar('Thai Buddha');
Aber das ist mir ORA-02248: invalid option for ALTER SESSION
.
Und meine Frage ist: Warum kann ich nicht mit bind-Variablen in DDL/SCL-statements in dynamic SQL?
InformationsquelleAutor Krumia | 2014-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bind-Variablen nicht erlaubt sind die in DDL-Anweisungen. Also, folgende Aussagen zu Fehlern führen:
Beispiel #1: - DDL-Anweisung. Verursachen ORA-01027: bind-Variablen nicht zulässig für Daten-definition-Operationen
Beispiel #2: die DDL-Anweisung. Verursachen ORA-00904: : Ungültiger Bezeichner
Beispiel #3: SCL-Anweisung. Verursachen ORA-02248: ungültige option für ALTER SESSION
Problem
Zu verstehen, warum dies geschieht, müssen wir betrachten,Wie Dynamische SQL-Anweisungen Verarbeitet Werden.
Beachten Sie, dass die parsing-Schritt passiert vor binding-Variablen, um die dynamische Anweisung. Wenn Sie untersuchen die vier oben genannten Beispiele, werden Sie feststellen, dass es keine Möglichkeit für den parser garantieren die syntaktische Gültigkeit der dynamischen SQL-Anweisungen, ohne zu wissen, die Werte für die bind-Variablen.
USING 42
Programmierer schriebUSING 'forty-two'
?:col_name
wäre ein Gültiger Spaltenname. Was ist, wenn die gebundene Spalte name war'identifier_that_well_exceeds_thirty_character_identifier_limit'
?NLS_CALENDAR
gebaut sind Konstanten (für eine bestimmte Oracle-version?). Parser kann nicht sagen, ob die gebundene variable einen gültigen Wert.Also die Antwort ist, dass Sie nicht binden-schema-Elemente wie Tabellennamen, Spaltennamen, die in der dynamischen SQL. Noch können Sie binden eingebauten Konstanten.
Lösung
Nur so erreichen Sie die Referenzierung von schemaelementen/Konstanten dynamisch ist die Verwendung von string-Verkettung in dynamischen SQL-Anweisungen.
Beispiel #1:
Beispiel #2:
Beispiel #3:
InformationsquelleAutor Krumia