首页 文章

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

提问于
浏览
-1

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

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

3 回答

  • 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;
    /
    

    “我需要有相互依赖的程序”

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

  • -1

    您可以在编译包体之前使用包并编译所有包规范来破坏依赖关系链 . 规范将全部编译而不考虑依赖关系,然后在编译主体时,它们可以按任何顺序执行,因为它们将引用已编译的规范 . 通常,您将使用* .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
    
  • 0

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

    alter package your_package compile;
    

    当然,这假设您的包是有效的 .

    如果任何一个(或两个)过程不在规范中,最好的做法是将它列为包体开头的前向声明 .

相关问题