Oracle中的包(package)在重新编译成功后,其它会话访问仍会出现“失效”提示,高手帮兄弟一把
故障重现方法
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会话)的错误提示?