Oracle:DBMS_UTILITY.EXEC_DDL_STATEMENT与EXECUTE IMMEDIATE

时间:2011-08-07 13:01:24

标签: sql oracle ddl

DBMS_UTILITY.EXEC_DDL_STATEMENTEXECUTE IMMEDIATE之间的区别是什么?

2 个答案:

答案 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;