Чому ми не можемо записати оператор ddl безпосередньо в блок PL / SQL


11

Чому ми не можемо писати заяви ddl безпосередньо в блок PL / SQL, наприклад, коли я пишу

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

Але,

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

Чому другий виконаний успішно?


Ця публікація в блозі, Oracle Не допускає заяви DDL всередині процедури, може дати відповідь.
Раджеш Саркар

Відповіді:


7

Як сказано в документації :

Тільки динамічний SQL може виконувати наступні типи операторів у програмних одиницях PL / SQL:

  • Висловлювання мови визначення даних (DDL), такі як CREATE, DROP, GRANT та REVOKE

TRUNCATEОперація DDL.

Під час використання EXECUTE IMMEDIATEпам’ятайте, що будь-які DDLоперації, які ви виконуєте, будуть неявно COMMITпоточною транзакцією.


1

DDL всередині PL / SQL-коду - більше виняток, ніж реальна потреба. Синтаксичний аналіз може розглядатися як перевірка структури, яка втрачається, якщо ваша структура змінюється під час виконання. Процедури призначені для того, щоб знову проаналізувати інші об'єкти (таблиці чи інший код pl / sql, представлення тощо). Кожен раз, коли залежно від об'єкта змінюється, його слід перекомпілювати. Отже, проаналізований код чогось, ніж зміна структури, неможливо перевірити і як такий скласти. Розглянемо випадок

DROP TABLE T1;

За час розбору буде знайдено таблицю і процедуру буде успішно скомпільовано, але при першому виконанні таблиця випадає і ваш код більше не дійсний (наступного разу DROP TABLE призведе до помилки). Аналогічно, будь-яка зміна DDL таблиці призведе до необхідності перекомпіляції, що втрачає перевагу для аналізу коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.