日期:2014-05-16  浏览次数:21084 次

关于oracle存储过程互相调用编译出错的问题。。
公司一个DB2的数据库移植到Oracle上,有一个定时调度任务需要调用存储过程A,A运行后,要调用其他10个互相调用的存储过程,基本过程就是A调用B,C,D等等,然后B,C,D又存在互相调用,问题是编译无法通过,A中报B,C无效,B中报C,D无效,C中又报B,D无效,D中又报C无效。

我先在D中把C注释掉,C中把B,D注释掉这样重新编译后A,B,C,D都可以通过,但是当我把D中注释掉的C打开后重新编译的时候再次报错,对象无效。。 并不是所有存储过程中都会报对象无效,比如在存储过程E,F中,B,C都可以编译通过

已经折腾了好长时间,大家帮忙分析一下,谢谢了
------解决方案--------------------
引用:
Quote: 引用:

创建PACKAGE的时候在包头里面对procedure的声明就是前向声明

是这样吗?
CREATE OR REPLACE 
PACKAGE TEST AS 

  /* TODO enter package declarations (types, exceptions, methods etc) here */ 
  procedure TEST1;
  procedure TEST2;
END TEST;

测了一下,编译还是通不过。。

以下编译能通过:

CREATE OR REPLACE PACKAGE TEST IS

  PROCEDURE TEST1;
  PROCEDURE TEST2;
END TEST;


CREATE OR REPLACE PACKAGE BODY TEST IS

  PROCEDURE TEST1 IS
  BEGIN
    TEST2;
    DBMS_OUTPUT.PUT_LINE('this is test1!!!');
  END TEST1;
  PROCEDURE TEST2 IS
  BEGIN
    TEST1;
    DBMS_OUTPUT.PUT_LINE('this is test2!!!');
  END TEST2;

BEGIN
  NULL;
END TEST
;