假设我有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;
答案 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认为这对您来说是个问题。