使用EXECUTE IMMEDIATE时,PL / SQL块不会执行到结束

问题描述 投票:0回答:2

我想达到什么目的?

  • 我想使用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;
oracle stored-procedures dynamic-sql
2个回答
1
投票

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

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

db<>fiddle here


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.