Подтвердить что ты не робот

Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE

Каковы различия между DBMS_UTILITY.EXEC_DDL_STATEMENT и EXECUTE IMMEDIATE?

4b9b3361

Ответ 1

В основном они делают то же самое, что и обеспечивает механизм для выполнения DDL-операторов в PL/SQL, который не поддерживается изначально. Если память мне хорошо помогает, EXEC_DDL_STATEMENT был доступен в версии пакета DBMS_UTILITY Oracle 7, тогда как Native Dynamic SQL (EXECUTE IMMEDIATE) был введен только в 8.

Есть несколько отличий. EXECUTE IMMEDIATE в основном заключается в выполнении динамического SQL (как указывает его имя NDS). тот факт, что мы можем использовать его для DDL, является by-by-by.

Но версия DBMS_UTILITY не сохраняется только для обратной совместимости, у нее есть один аккуратный трюк, с которым мы не можем справиться с EXECUTE IMMEDIATE - запуск DDL распределенным способом. Мы можем запустить это выражение из нашей локальной базы данных, чтобы создать таблицу в удаленной базе данных (предоставляя нашим пользователям необходимые привилегии):

SQL>  exec [email protected]_db('create table t1 (id number)');

Я не рекомендую это, просто скажите, что это можно сделать.

Ответ 2

Я понимаю, что опоздал на 9 лет, но есть еще одно отличие.

dbms_utility.exec_ddl_statement не выполнит ничего, кроме DDL. Если вы попытаетесь сделать, скажем, вкладыш, он не сделает этого. Он также не вернет ошибку, так что вы не будете знать, что не вставили.

-- drop table kevtemp1;

create table kevtemp1 (a integer);

insert into kevtemp1 values (1);
commit;

begin
    insert into kevtemp1 values (2);
end;
/
commit;

begin
   DBMS_UTILITY.EXEC_DDL_STATEMENT('insert into kevtemp1 values (3)');
end;
/
commit;


select * from kevtemp1;