Oracle中的包(package)在重新编译成功后,其它会话访问仍会出现“失效”提示,高手帮兄弟一把

babystudio 2007-03-16 10:18:53
故障重现方法
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会话)的错误提示?
...全文
1595 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgm78 2007-03-19
  • 打赏
  • 举报
回复
楼上说的有道理。


具体建议去metalink上再查查资料的
babystudio 2007-03-16
  • 打赏
  • 举报
回复
我先把我的失败经验说明一下吧。
如果在B会话中每次调用前重新compile一下,是可以保证B会话的正确执行;但是每次compile会影响C会话的执行。
如果没个会话在每次调用前都进行compile,可能发生compile冲突。
xiaoxiao1984 2007-03-16
  • 打赏
  • 举报
回复
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,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧