【问题标题】:PL/SQL block does not execute to end when using EXECUTE IMMEDIATE使用 EXECUTE IMMEDIATE 时 PL/SQL 块不执行结束
【发布时间】:2020-04-25 02:46:54
【问题描述】:

我想达到什么目的?

  • 我想使用 PL/SQL 将 Oracle 过程从一个用户复制到另一个用户。
  • 我想复制所有过程 - 包括那些有编译错误的过程。

我卡在哪里了?

  • 在 EXECUTE IMMEDIATE 创建带有编译错误的过程后,PL/SQL 块不再执行。
  • 也不例外!

以下两段代码演示了该问题。第一个块按预期执行。第二个块没有全部执行。有编译错误的过程 p3 不是问题。我的问题是没有创建过程 p4。

-- creates procedure p1 and p2
BEGIN

  EXECUTE IMMEDIATE 'create or replace procedure p1 is begin null; end;';
  EXECUTE IMMEDIATE 'create or replace procedure p2 is begin null; end;';

  dbms_output.put_line('Done!');

END;
-- creates only procedure p3 and exits with no error
BEGIN

  EXECUTE IMMEDIATE 'create or replace procedure p3 is begin null end;'; -- compilation error (missing semicolon)
  EXECUTE IMMEDIATE 'create or replace procedure p4 is begin null; end;';

  dbms_output.put_line('Done!');

END;

【问题讨论】:

  • 我很好奇你为什么要这样复制程序?如果过程几乎相同,你不能概括一个并传递额外的参数吗?
  • 我得到一个有效的错误返回 - ORA-24344: 编译错误成功 ORA-06512: at line 3 24344. 00000 - "success with compilation error" *原因:发生 sql/plsql 编译错误. *操作:返回 OCI_SUCCESS_WITH_INFO 以及错误代码
  • 是否有任何原因,您没有包含您的 plsql 对象的应用程序架构,您希望能够通过 exec privs 执行它们?
  • 这似乎是管理模式的一种非常糟糕的方式。基本原理是什么?
  • @OldProgrammer 程序差别很大。上面的代码只是为了演示问题。

标签: oracle stored-procedures dynamic-sql


【解决方案1】:

要详细了解 Bob 的回答:如果您想忽略编译异常,您需要将每个 execute immediate 包装在一个匿名块中。

BEGIN

  BEGIN
    EXECUTE IMMEDIATE 'create or replace procedure p3 is begin null end;'; -- compilation error (missing semicolon)
  EXCEPTION WHEN OTHERS THEN null; -- ignore exceptions
  END;

  BEGIN
    EXECUTE IMMEDIATE 'create or replace procedure p4 is begin null; end;';
  EXCEPTION WHEN OTHERS THEN null; -- ignore exceptions
  END;

  dbms_output.put_line('Done!');

END;

【讨论】:

    【解决方案2】:

    是的,引发了一个异常。您会看到,“编译错误成功”IS 是一个异常。您可以通过定义异常变量并使用EXCEPTION_INIT对其进行初始化来捕获它:

    eCompilation_error EXCEPTION;
    PRAGMA EXCEPTION_INIT(eCompilation_error, -24344);
    

    db<>fiddle here

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多