【问题标题】:Oracle: DBMS_UTILITY.EXEC_DDL_STATEMENT vs EXECUTE IMMEDIATEOracle:DBMS_UTILITY.EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE
【发布时间】:2011-10-21 19:52:03
【问题描述】:

DBMS_UTILITY.EXEC_DDL_STATEMENTEXECUTE IMMEDIATE 有什么区别?

【问题讨论】:

  • 不知道为什么有人投票结束这个作为“离题”。这是一个关于编程语言的问题,有什么离题的?

标签: sql oracle dynamic-sql ddl


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2021-04-15
      • 1970-01-01
      • 2019-03-14
      • 2011-06-10
      • 1970-01-01
      • 2023-03-18
      • 2019-12-15
      • 2019-10-19
      相关资源
      最近更新 更多