解决方案 »

  1.   

    很简单,你每次调用procedure时必须保证被调用的procedure已经存在。你先注释掉的这种方法是正确的。至于报错你就需要好好检查一下了。检查一下参数之类的看是否匹配。
      

  2.   

    很简单,你每次调用procedure时必须保证被调用的procedure已经存在。你先注释掉的这种方法是正确的。至于报错你就需要好好检查一下了。检查一下参数之类的看是否匹配。
    谢谢,我已经检查过一次参数了,但是我还是再检查一次吧,再次感谢!
      

  3.   

    你好!再次检查了参数,没有问题的。另外,如果是传参错误了,编译会报对象无效吗?参数个数或者类型不对会报错,这样就很奇怪了,如果你的procedure是在同一个scheme下不应该会出现这种情况的,如果你用的PL/SQL developer,你尝试一下在PROCEDURE中能找到你要调用的procedure吗?
      

  4.   

    奇怪的就是,能够找到我要调用的procedure,一共11个procedure,都是同一个用户的,有两个procedure在其中1个procedure中调用可以编译通过,在另外2个里面调用编译就是通不过。
      

  5.   

    奇怪的就是,能够找到我要调用的procedure,一共11个procedure,都是同一个用户的,有两个procedure在其中1个procedure中调用可以编译通过,在另外2个里面调用编译就是通不过。
    以下是我的测试:CREATE OR REPLACE PROCEDURE TEST1 IS
    BEGIN
      TEST2;
      DBMS_OUTPUT.PUT_LINE('this is test1!!!');
    END TEST1;
    CREATE OR REPLACE PROCEDURE TEST2 IS
    BEGIN
      TEST1;  DBMS_OUTPUT.PUT_LINE('this is test2!!');
    END TEST2;
    编译的时候确实会报错。想了一下我觉得报错是有道理的。
    仔细想一下当你执行上面的procedure中的任何一个时其实已经陷入了死循环
      

  6.   

    奇怪的就是,能够找到我要调用的procedure,一共11个procedure,都是同一个用户的,有两个procedure在其中1个procedure中调用可以编译通过,在另外2个里面调用编译就是通不过。
    还有个解释如下:
    当你编译P1时,系统会检查你P1中包含的对象是否有效,当检查P2时,其实P2此时处于无效的状态,P2处于无效状态的原因在于P2中包含有P1(此时P1正在编译,并不是一个有效的对象)。如此一来就会出现编译无法通过的情况。
    以上只是我的个人观点。
      

  7.   

    是啊,有4个procedure循环互相调用,不知道当时怎么会写成这个样子的,在DB2里可以正常运行,没有编译的问题,到Oracle里就不行了。。
      

  8.   

    我这种情况还有救吗,大侠?我从来没有这样用过,但是从测试的结果来看,好像oracle不支持这样循环调用。
    不知道其他高手能有解决方法么?
    从程序的角度来说建议还是不要这样循环调用,可读性较差,看程序的也很痛苦。就好比C中的递归
      

  9.   

    刚在网上搜到一个类似的问题,说是需要使用前向声明来解决,不知道行不行?
    用前向声明,那你就把全部的procedure整合在一个PACKAGE里面嘛
      

  10.   

    用前向声明,那你就把全部的procedure整合在一个PACKAGE里面嘛
    不知道这个该如何操作?
      

  11.   

    用前向声明,那你就把全部的procedure整合在一个PACKAGE里面嘛
    不知道这个该如何操作?
    创建PACKAGE的时候在包头里面对procedure的声明就是前向声明
      

  12.   

    是这样吗?
    CREATE OR REPLACE 
    PACKAGE TEST AS   /* TODO enter package declarations (types, exceptions, methods etc) here */ 
      procedure TEST1;
      procedure TEST2;
    END TEST;
    测了一下,编译还是通不过。。
      

  13.   

    是这样吗?
    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;
      

  14.   

    是这样吗?
    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;是这样子的,编译的问题果然能够解决,非常感谢!