Warum können wir die ddl-Anweisung nicht direkt in den PL / SQL-Block schreiben?

11

Warum können wir ddl-Anweisungen nicht direkt in den PL / SQL-Block schreiben, zum Beispiel wenn ich schreibe?

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

Aber,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

Warum wurde der zweite erfolgreich ausgeführt?

Ravi
quelle

Antworten:

7

Wie es in der Dokumentation heißt :

Nur dynamisches SQL kann die folgenden Arten von Anweisungen in PL / SQL-Programmeinheiten ausführen:

  • DDL-Anweisungen (Data Definition Language) wie CREATE, DROP, GRANT und REVOKE

Eine TRUNCATEOperation ist DDL.

Denken Sie bei der Verwendung EXECUTE IMMEDIATEdaran, dass alle von DDLIhnen ausgeführten COMMITVorgänge implizit die aktuelle Transaktion darstellen.

Philᵀᴹ
quelle
1

DDL in PL / SQL-Code ist mehr Ausnahme als wirklich nötig. Das Parsen kann als Strukturüberprüfung angesehen werden, die verloren geht, wenn sich Ihre Struktur bei der Ausführung ändert. Prozeduren sollen andere Objekte (Tabellen oder anderen pl / sql-Code, Ansichten usw.) erneut analysieren. Jedes Mal, wenn sich ein Objekt ändert, sollte es neu kompiliert werden. Das Erstellen von analysiertem Code aus etwas anderem als der Änderungsstruktur kann daher nicht überprüft und als solches kompiliert werden. Betrachten Sie den Fall

DROP TABLE T1;

Während der Analysezeit würde die Tabelle gefunden und die Prozedur erfolgreich kompiliert, aber bei der ersten Ausführung wird die Tabelle gelöscht und Ihr Code ist nicht mehr gültig (das nächste Mal würde DROP TABLE zu einem Fehler führen). In ähnlicher Weise würde jede Änderung an der Tabellen-DDL eine Neukompilierung erforderlich machen, wodurch der Vorteil der Code-Analyse verloren geht.

igr
quelle