EXECUTE IMMEDIATE mit NG-Klausel geben Fehler
-
06-07-2019 - |
Frage
Alle,
Ich bin sehr neu in der Regel zu Stored Procedures, aber ich habe Schwierigkeiten vor allem mit dem in Oracle. Ich habe ein sehr einfaches Beispiel geschaffen, was ich zu tun versuchen, und ich bin immer noch den gleichen Fehler mit dieser vereinfachten Version zu bekommen.
Das Beispiel gespeicherte Prozedur ist wie folgt:
CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
DECLARE
v_tab VARCHAR2(50);
v_strSQL VARCHAR2(50);
BEGIN
v_strSQL := 'SELECT * FROM :1';
v_tab := 'ex.emp';
EXECUTE IMMEDIATE v_strSQL USING v_tab;
END;
END;
Wenn ich die oben gespeicherte Prozedur CALL ashish_test()
aufrufen, erhalte ich:
Basierend auf diesem Artikel (Suchen Sie nach Beispiel 7-1), sollte USING
Schlüsselwort die nummerierte Platzhalter (:1
) innerhalb v_strSQL
mit dem Wert in v_tab
gespeichert ersetzen. Allerdings halte ich ungültige Tabelle Fehler. Ich vermute, es ist, weil EXECUTE IMMEDIATE
kann den Platzhalter mit dem Wert aus irgendeinem Grunde ersetzen, aber ich bin nicht sicher, warum das so ist. Weiß jemand, ob ich hier etwas Dummes tue?
Ich verwende diese auf Oracle 10g Datenbank und mit PL / SQL Developer.
Lösung
Die USING-Klausel ist nur für Bind-Variablen (das heißt, wo Sie Spaltennamen in einer select-Anweisung verwenden würden), nicht Tabellennamen. Typische Anwendungen würden wie folgt aussehen:
Select col1 from table1 where col2 = :a
Wenn Sie möchten, verwenden variable Tabellennamen verwenden, etwa so:
v_tab := 'ex.emp';
v_strSQL := 'SELECT * FROM ' || v_tab;
EXECUTE IMMEDIATE v_strSQL;