Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT и EXECUTE IMMEDIATE - PullRequest
21 голосов
/ 07 августа 2011

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

Ответы [ 2 ]

31 голосов
/ 07 августа 2011

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

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

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

SQL>  exec DBMS_UTILITY.EXEC_DDL_STATEMENT@remote_db('create table t1 (id number)');

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

1 голос
/ 08 июля 2019

Я понимаю, что я опоздал на 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;
...