提问人:Revious 提问时间:8/7/2011 最后编辑:APCRevious 更新时间:9/21/2021 访问量:14238
甲骨文:DBMS_UTILITY。EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE
Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATE
答:
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;
评论