DBMS_UTILITY.EXEC_DDL_STATEMENT
和EXECUTE IMMEDIATE
之间的区别是什么?
答案 0 :(得分:30)
从根本上说,它们做同样的事情,即提供一种在PL / SQL中执行DDL语句的机制,本机不支持这种机制。如果内存对我有用,那么EXMS_DDL_STATEMENT在Oracle 7版本的DBMS_UTILITY包中可用,而Native Dynamic 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 :(得分:1)
我知道我的回复迟到了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;