故障重现方法
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.   

    我先把我的失败经验说明一下吧。
        如果在B会话中每次调用前重新compile一下,是可以保证B会话的正确执行;但是每次compile会影响C会话的执行。
        如果没个会话在每次调用前都进行compile,可能发生compile冲突。
      

  2.   

    1. 楼主新打开一个session去执行就没有该问题了
    2. 因为在A会话修改包并重复编译的时候之前,B会话已经执行过一次A会话的包中的函数,而A会话修改和编译完毕后,B会话再次调用A会话中的包中的函数,oracle发现缓存区中的包的函数已经是旧的了,所以返回提示信息:
    ORA-04068: 已丢弃程序包  的当前状态
    ORA-04061: package body "DB2INST2.PKGTEST" 的当前状态失效
    ORA-04065: 未执行, 已更改或删除 package body "DB2INST2.PKGTEST" -- 注意“已更改”
    然后删除了缓存中的包pkgtest的函数
    再次执行的时候,重新读取函数,就不会存在该问题
    如果重新打开一个session的去执行的话,也不会存在该问题
      

  3.   

    楼上说的有道理。
    具体建议去metalink上再查查资料的