2

我有一个包装程序(proc_main),它在其中调用一些程序。

create or replace Procedure proc_main
as
begin

proc_child1;

proc_child2;

proc_child3;

proc_compile_invalids; -- This invokes "alter procedure <procedure_name> compile" statement for all the invalids.

end;
/

proc_child 过程应用一些处理逻辑,其中涉及一些步骤来重命名其中的表。

这会使程序无效,这就是为什么我有 proc_compile_invalids 程序再次将它们设置为有效状态的原因。

我的问题是:当我执行 proc_main 过程时,它使主过程以及内部子过程无效。因此,当最后一步调用 proc_compile_invalids 时,它会挂起,因为它试图重新编译主调用过程。

显然,如果我删除最后一步并单独执行它,这不是问题。

我知道我可以通过评论编译过程并将其作为独立的执行将它们分离为 2 个不同的调用。而且我也知道这是一个装饰步骤,因为 oracle 会在下次执行之前尝试编译一个过程。所以,不管怎样,无效者变得有效。但是,当天执行结束时,他们都处于无效状态,我被当权者质疑是否可以避免!

所以,只是想知道我是否可以避免分离调用并仍然将其保留为主过程的最后一步。

任何想法/指针都非常感谢。

4

2 回答 2

6

您可以使用动态 SQL来打破依赖关系:

CREATE OR REPLACE PROCEDURE proc_main AS
BEGIN

   EXECUTE IMMEDIATE 'BEGIN proc_child1; END;';

   EXECUTE IMMEDIATE 'BEGIN proc_child2; END;';

   EXECUTE IMMEDIATE 'BEGIN proc_child3; END;';

   proc_compile_invalids;  -- This invokes 
                           -- "alter procedure <procedure_name> compile" 
                           -- statement for all the invalids.

END;
于 2012-09-13T15:33:49.513 回答
3

甲骨文 11g 起

您可以使用dbms_utility包的compile_schema过程而不是在主过程中重新编译指定模式中的所有无效过程、函数、包和触发器proc_compile_ivalids

create or replace Procedure proc_main
as
begin
  Proc_child1;
  proc_child2;
  proc_child3;
  dbms_utility.compile_schema(schema, false);
end;
于 2012-09-13T15:59:28.790 回答