DBMS_UTILITY.EXEC_DDL_STATEMENT
和EXECUTE IMMEDIATE
之间的区别是什么
发布于 2011-08-07 22:12:16
从根本上说,它们做的是相同的事情,即提供一种在PL/SQL中执行DDL语句的机制,这在本地是不受支持的。如果我没记错的话,在Oracle7版本的DBMS_UTILITY包中提供了EXEC_DDL_STATEMENT,而Native Dynamic SQL (EXECUTE IMMEDIATE)只在8中引入。
有一些不同之处。EXECUTE IMMEDIATE主要用于执行动态SQL (如其NDS别名所示)。我们可以将它用于DDL的事实是顺便提一下的。而EXEC_DDL_STATEMENT() -正如所建议的那样-只能执行DDL。
但是DBMS_UTILITY版本的保留并不仅仅是为了向后兼容,它有一个巧妙的技巧,我们不能用分布式方式执行立即运行的DDL。我们可以从本地数据库运行以下语句,以便在远程数据库上创建表(前提是我们的用户在远程数据库中具有必要的权限):
SQL> exec DBMS_UTILITY.EXEC_DDL_STATEMENT@remote_db('create table t1 (id number)');
我并不推荐这样做,只是说这是可以做到的。
发布于 2019-07-08 20:29:04
我意识到我晚了9年才回复,但还有一个不同之处。
除了DDL,dbms_utility.exec_ddl_statement不会执行任何东西。如果你尝试做一个插入操作,它不会这样做。它也不会返回错误,所以你不会知道你没有插入。
-- 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;
https://stackoverflow.com/questions/6973003
复制相似问题