Oracle:DBMS_UTILITY.EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE
Posted
技术标签:
【中文标题】Oracle:DBMS_UTILITY.EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE【英文标题】:Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE 【发布时间】:2011-10-21 19:52:03 【问题描述】:DBMS_UTILITY.EXEC_DDL_STATEMENT
和EXECUTE IMMEDIATE
有什么区别?
【问题讨论】:
不知道为什么有人投票结束这个作为“离题”。这是一个关于编程语言的问题,有什么离题的? 【参考方案1】:从根本上说,它们做同样的事情,即提供一种在 PL/SQL 中执行 DDL 语句的机制,而本机不支持这种机制。如果没记错的话,EXEC_DDL_STATEMENT 在 Oracle 7 版本的 DBMS_UTILITY 包中可用,而 Native Dynamic SQL (EXECUTE IMMEDIATE) 仅在 8 中引入。
有几个不同之处。 EXECUTE IMMEDIATE 主要是关于执行动态 SQL(正如它的 NDS 别名所示)。我们可以将它用于 DDL 的事实是顺便说一句。而 EXEC_DDL_STATEMENT() - 正如建议的那样 - 只能执行 DDL。
但保留 DBMS_UTILITY 版本并不仅仅是为了向后兼容,它有一个绝妙的技巧,我们不能用 EXECUTE IMMEDIATE 做到 - 以分布式方式运行 DDL。我们可以从本地数据库运行此语句以在远程数据库上创建一个表(假设我们的用户在那里拥有必要的权限):
SQL> exec DBMS_UTILITY.EXEC_DDL_STATEMENT@remote_db('create table t1 (id number)');
我不推荐这个,只是说可以做到。
【讨论】:
【参考方案2】:我意识到我迟到了 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;
【讨论】:
以上是关于Oracle:DBMS_UTILITY.EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE的主要内容,如果未能解决你的问题,请参考以下文章
安装_oracle11G_客户端_服务端_链接_oracle