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?


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.