甲骨文:DBMS_UTILITY。EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE

Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE

提问人:Revious 提问时间:8/7/2011 最后编辑:APCRevious 更新时间:9/21/2021 访问量:14238

问:

和 之间有什么区别?DBMS_UTILITY.EXEC_DDL_STATEMENTEXECUTE IMMEDIATE

Oracle Dynamic-SQL DDL

评论

12赞 APC 8/7/2011
不知道为什么有人投票将其作为“题外话”关闭。这是一个关于编程语言的问题,有什么题外话?

答:

36赞 APC 8/7/2011 #1

从根本上说,它们做同样的事情,即提供一种在 PL/SQL 中执行 DDL 语句的机制,这在 PL/SQL 中是不支持的。如果没记错的话,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)');

我不建议这样做,只是说可以做到。

3赞 user11754489 7/8/2019 #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;