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?
Odpowiedzi:
Jak napisano w dokumentacji :
TRUNCATE
OperacjaDDL
.Podczas korzystania
EXECUTE IMMEDIATE
pamiętaj, że wszelkieDDL
wykonywane operacje będą domyślnie dotyczyćCOMMIT
bieżącej transakcji.źródło
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
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.
źródło