本帖最后由 dupeng51 于 2010-01-28 15:08:46 编辑

解决方案 »

  1.   

    3. 前向声明(Forward Declarations)
    由于本地P L / S Q L子程序的名称是标识符,所以它们必须在引用前声明。一般来说,满足这
    种要求不是一件困难的事情。然而,在具有相互引用的子程序中,实现上述要求就有一定的难
    度。请看下面的例子:
    节选自在线代码mutual.sql
    DECLARE
    v_TempVal BINARY_INTEGER := 5;
    -- Local procedure A. Note that the code of A calls procedure B.
    PROCEDURE A(p_Counter IN OUT BINARY_INTEGER) IS
    BEGIN
    DBMS_OUTPUT.PUT_LINE('A(' || p_Counter || ')');
    IF p_Counter > 0 THEN
    B(p_Counter);
    p_Counter := p_Counter - 1;
    END IF;
    END A;
    -- Local procedure B. Note that the code of B calls procedure A.
    PROCEDURE B(p_Counter IN OUT BINARY_INTEGER) IS
    BEGIN
    DBMS_OUTPUT.PUT_LINE('B(' || p_Counter || ')');
    p_Counter := p_Counter - 1;
    A(p_Counter);
    END B;
    BEGIN
    B(v_TempVal);
    END;该例子无法进行编译,其原因是过程 A调用了过程B,因此过程B必须要在过程A之前声明以
    便可以确定对过程B的引用。同时,由于过程B要调用过程A,要求过程A也要在过程B之前声明
    以便对确定对过程B的引用。在这种情况下,上述要求不能同时满足。为了协调这种需求,我们
    可以使用前向声明来解决该问题。前向声明只需要提供过程名和其形参就可以实现相互引用的
    过程的并存。除此之外,前向声明还可以用在包头中。
      

  2.   

    --使用包
    --创建包头
    CREATE OR REPLACE PACKAGE mypack AS
      PROCEDURE a;
      PROCEDURE b;
    END;
    /
    --创建包体
    CREATE OR REPLACE PACKAGE BODY mypack AS
      PROCEDURE a IS
      BEGIN
        b;
        dbms_output.put_line('in proc a');
      END;
      PROCEDURE b IS
      BEGIN
        a;
        dbms_output.put_line('in proc b');
      END;
    END;
    /
    /
      

  3.   

    java 能整段前向声明的看下不