Почему мы не можем записать оператор 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;
/

Почему второй выполнен успешно?

Ответы:


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.