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_STATEMENTEXECUTE 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

oracle 11G补丁(p6890831_111070_AIX5L_1of2.zip)安装方法

透视Oracle查询

oracle 11g 安装包解压的问题

Oracle 设置主键自增长__Oracle

Oracle学习笔记_09_字符串相关函数