PL / SQL:找不到被调用的程序单元,现有状态已失效

时间:2017-11-06 10:19:04

标签: database oracle session plsql

假设我有2个包Test_1和Test_2,每个包都有程序A和B,Test_1.A以无限循环运行,它调用Test_2.B。

当我在Test_2.B中进行更改并重新编译包时,我得到以下错误。

ORA-04061: existing state of package body 
"Test_2.B" has been invalidated
ORA-04065: not executed, altered or dropped package body "Test_2.B"
ORA-06508: PL/SQL: could not find program unit being called: "Test_2.B"
ORA-04061: existing state of  has been invalidated
ORA-04061: existing state of package body "Test_2.B" has been invalidated
ORA-04065: not. At LocationORA-06512: at line 1
ORA-06512: at "Test_1.A", line 10

如果我取消Test_1.A的循环并重新运行,它可以工作,但我不想这样做。

我尝试使用下面的内容,但它们不起作用。

   DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES);
   DBMS_SESSION.RESET_PACKAGE;

2 个答案:

答案 0 :(得分:0)

事实上,正如你所提到的那样,它是oracle database这样一个奇怪的问题并在第二次通话中工作(正在解决)。

您可以使用两种方式来压制:

  • 使用pragma serially_reusable

      

    创建或替换包Test_2为

         

    pragma serially_reusable;
       v_abc_1号码;
       v_def_2 date;
       ...

         

    开始

  • 如果您使用的是 RAC数据库,您的dba可能会发出此命令(如果适合您的系统),或者只是自己更改会话:

      

    alter system set "_disable_fast_validate"=true scope=both;

         

    alter session set "_disable_fast_validate"=true

    作为替代

答案 1 :(得分:0)

提示是“ ORA-04061:程序包主体“ Test_2.B”的现有状态已无效”。这意味着包Test_2.B具有状态(通常在范围或主体中声明的变量)。每次编译都会重置此类变量的值,Oracle认为这对您来说是个问题。