Dlaczego nie możemy napisać instrukcji ddl bezpośrednio do bloku PL / SQL

11

Dlaczego nie możemy pisać instrukcji ddl bezpośrednio w bloku PL / SQL, na przykład podczas pisania?

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

Ale,

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

Dlaczego drugi został wykonany pomyślnie?

Ravi
źródło
Ten post na blogu, Oracle nie zezwala na instrukcje DDL w ramach procedury, może dostarczyć odpowiedzi.
Rajesh Sarkar

Odpowiedzi:

7

Jak napisano w dokumentacji :

Tylko dynamiczny SQL może wykonywać następujące typy instrukcji w jednostkach programu PL / SQL:

  • Instrukcje języka definicji danych (DDL), takie jak CREATE, DROP, GRANT i REVOKE

TRUNCATEOperacja DDL.

Podczas korzystania EXECUTE IMMEDIATEpamiętaj, że wszelkie DDLwykonywane operacje będą domyślnie dotyczyć COMMITbieżącej transakcji.

Philᵀᴹ
źródło
1

DDL w kodzie PL / SQL jest bardziej wyjątkiem niż rzeczywistą potrzebą. Analiza może być postrzegana jako weryfikacja struktury, która jest tracona, jeśli struktura zmienia się podczas wykonywania. Procedury mają być ponownie analizowane z innymi obiektami (tabele lub inny kod PL / SQL, widoki itp.). Za każdym razem, gdy zmienia się obiekt, należy go ponownie skompilować. Tak więc utworzenie przeanalizowanego kodu czegoś innego niż zmiana struktury nie może być zweryfikowane i jako takie skompilowane. Rozważ przypadek

DROP TABLE T1;

W czasie analizy tabela zostanie znaleziona, a procedura pomyślnie skompilowana, ale przy pierwszym wykonaniu tabela zostanie usunięta, a kod nie będzie już prawidłowy (następnym razem DROP TABLE spowoduje błąd). Podobnie każda zmiana w DDL tabeli spowodowałaby konieczność ponownej kompilacji, tracąc tym samym przewagę podczas analizowania kodu.

igr
źródło