故障重现方法
1、打开一个SQLPLUS(A会话)执行下面脚本创建包
create or replace package PKGTEST is
CVersion constant varchar2(15) := '2.2.5.1'; --版本号
function Version return varchar2;
end PKGTEST;
/
create or replace package body PKGTEST is
function Version return varchar2 is
begin
return(CVersion);
end;
begin
null;
end PKGTEST;
/
alter package PKGTEST compile specification;
alter package PKGTEST compile body;
2、打开另一个SQLPLUS(B会话),执行下面语句调用包,成功
SQL> select pkgtest.version() from dual;PKGTEST.VERSION()
------------------------------------------------------------2.2.5.1
3、在A会话中重复执行一次包编译脚本(当然实际工作中肯定对包体有修改)
4、在B会话中再次调用包,会先报错
SQL> select pkgtest.version() from dual;
select pkgtest.version() from dual
*
ERROR 位于第 1 行:
ORA-04061: package "CUSTOMER.PKGTEST" 的当前状态失效
ORA-04065: 未执行,已更改或删除 package "CUSTOMER.PKGTEST"
5、B会话中再次调用成功 大家有没有好的办法解决B会话(甚至C会话、D会话)的错误提示?
1、打开一个SQLPLUS(A会话)执行下面脚本创建包
create or replace package PKGTEST is
CVersion constant varchar2(15) := '2.2.5.1'; --版本号
function Version return varchar2;
end PKGTEST;
/
create or replace package body PKGTEST is
function Version return varchar2 is
begin
return(CVersion);
end;
begin
null;
end PKGTEST;
/
alter package PKGTEST compile specification;
alter package PKGTEST compile body;
2、打开另一个SQLPLUS(B会话),执行下面语句调用包,成功
SQL> select pkgtest.version() from dual;PKGTEST.VERSION()
------------------------------------------------------------2.2.5.1
3、在A会话中重复执行一次包编译脚本(当然实际工作中肯定对包体有修改)
4、在B会话中再次调用包,会先报错
SQL> select pkgtest.version() from dual;
select pkgtest.version() from dual
*
ERROR 位于第 1 行:
ORA-04061: package "CUSTOMER.PKGTEST" 的当前状态失效
ORA-04065: 未执行,已更改或删除 package "CUSTOMER.PKGTEST"
5、B会话中再次调用成功 大家有没有好的办法解决B会话(甚至C会话、D会话)的错误提示?
如果在B会话中每次调用前重新compile一下,是可以保证B会话的正确执行;但是每次compile会影响C会话的执行。
如果没个会话在每次调用前都进行compile,可能发生compile冲突。
2. 因为在A会话修改包并重复编译的时候之前,B会话已经执行过一次A会话的包中的函数,而A会话修改和编译完毕后,B会话再次调用A会话中的包中的函数,oracle发现缓存区中的包的函数已经是旧的了,所以返回提示信息:
ORA-04068: 已丢弃程序包 的当前状态
ORA-04061: package body "DB2INST2.PKGTEST" 的当前状态失效
ORA-04065: 未执行, 已更改或删除 package body "DB2INST2.PKGTEST" -- 注意“已更改”
然后删除了缓存中的包pkgtest的函数
再次执行的时候,重新读取函数,就不会存在该问题
如果重新打开一个session的去执行的话,也不会存在该问题
具体建议去metalink上再查查资料的