首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE

Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE
EN

Stack Overflow用户
提问于 2011-08-07 21:01:24
回答 2查看 12.6K关注 0票数 25

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。我们可以从本地数据库运行以下语句,以便在远程数据库上创建表(前提是我们的用户在远程数据库中具有必要的权限):

代码语言:javascript
复制
SQL>  exec DBMS_UTILITY.EXEC_DDL_STATEMENT@remote_db('create table t1 (id number)');

我并不推荐这样做,只是说这是可以做到的。

票数 36
EN

Stack Overflow用户

发布于 2019-07-08 20:29:04

我意识到我晚了9年才回复,但还有一个不同之处。

除了DDL,dbms_utility.exec_ddl_statement不会执行任何东西。如果你尝试做一个插入操作,它不会这样做。它也不会返回错误,所以你不会知道你没有插入。

代码语言:javascript
复制
-- 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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6973003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档