使用相互依赖的过程进行Oracle PL / SQL包编译

时间:2014-12-12 01:51:42

标签: oracle plsql compilation package procedure

如果我有程序Proc1和另一个程序Proc2,其中proc1依赖于proc2而proc2依赖于proc1。我需要用这两个程序编译包pkg1。

Oracile 9i。 我怎样才能实现它?是否需要任何特定的关键字?

3 个答案:

答案 0 :(得分:3)

我认为这些都是私有程序,也就是说,都没有出现在软件包规范中。

如果规范中出现了这两个程序,那么就没有问题了,因为正文反对公开声明。

同样,如果规范中出现了一个程序,那么就没有问题了:只需在公共程序之前在私人程序中编写私人程序。

但是如果两个程序都是私有的,那么你需要使用前向声明。这仅仅意味着宣布程序'包裹顶部的签名。完全像把它们放在规范中,只有私有。这是一个规范...

create or replace package pkg as
    procedure main (n0 in out number);
end;
/

......和身体......

create or replace package body pkg as
    -- forward declarations
    procedure p1 (n1 in out number);
    procedure p2 (n2 in out number);

    -- actual declarations    
    procedure p1 (n1 in out number)
    is
    begin
        dbms_output.put_line('P1='||n1);
        if n1 < 3 then
            p2(n1);
        end if;
    end p1;
    procedure p2 (n2 in out number)
    is
    begin
        dbms_output.put_line('P2='||n2);
        n2 := n2+1;
        if n2 < 3 then
            p1(n2);
        end if;
    end p2;

    procedure main (n0 in out number)
    is
    begin
        if n0 < 0 then 
            p1(n0);
        else
            p2(n0);
        end if;
    end main;

end pkg;
/

  

&#34;我需要有相互依赖的程序&#34;

你真的应该试图找出一种避免循环依赖的方法。这是一个非常糟糕的编程习惯。很难理解程序是如何相互关联的,我们必须管理递归并确保两个程序最终都会在不调用另一个程序的情况下最终退出。请记住,这不仅仅是您遇到的问题:它是您将遗传给代码的未来维护者的遗产。

答案 1 :(得分:0)

您可以在编译包体之前使用包并编译所有包规范来破坏依赖关系链。规范将全部编译而不考虑依赖关系,然后在编译主体时,它们可以按任何顺序执行,因为它们将引用已编译的规范。通常,您将使用* .pks后缀和带有* .pkb后缀的主体以及编译它们的某种构建脚本来存储包规范。像这样

/* Master Package Build Script */

-- Specs
@package_a.pks
@package_b.pks
@package_c.pks

-- Bodies
@package_a.pkb
@package_b.pkb
@package_c.pkb

答案 2 :(得分:-1)

如果这两个程序都在规范中,那么只需编译包就可以了:

alter package your_package compile;

这假设您的包裹当然有效。

如果规范中没有任何一个(或两个)过程,那么最好的办法就是将它列为包体开头的前向声明。