gpt4 book ai didi

oracle - 编译无效的 oracle 程序

转载 作者:行者123 更新时间:2023-12-02 09:38:14 26 4
gpt4 key购买 nike

我有一个包装程序(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 时,它会因尝试重新编译主调用过程而挂起。

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

我知道我可以通过注释编译过程并将其作为独立的执行来将它们分离为两个不同的调用。我也知道这是一个装饰步骤,因为甲骨文会在下次执行之前尝试编译一个过程。所以,无效者无论如何都会变得有效。但是,当日执行结束时,它们都处于无效状态,我被权力质疑是否可以避免!

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

非常感谢任何想法/指示。

最佳答案

您可以使用dynamic 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;

关于oracle - 编译无效的 oracle 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com