Каковы различия между DBMS_UTILITY.EXEC_DDL_STATEMENT
и EXECUTE IMMEDIATE
?
Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE
Ответ 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;