如果我们使用Oracle的oerr程序看看
ORA-04068的定义,我们会得到下面的信息:
$oerr ora 04068 04068, 00000, "existing state of packages has been discarded" // *Cause: One of errors 4060 - 4067 when attempt to execute a stored procedure. // *Action: Try again after proper re-initialization of any // application's state. |
这个错误显示执行包的现有状态被另一个会话的一个动作无效化了。这个“状态”涉及包在规范或体中定义的任何全局变量(包括常量)。引起这个错误的动作一般是(但不局限于此)在得到了发生错误的会话所使用的连接之后包的重新编译。Oracle 建议的动作是重新初始化应用程序状态以调整包的新状态后重新尝试。
出现原因:
一般是系统运行过程中,对Package重新编译,tbw会导致系统对于这个Session的Package失效。
解决办法:
重启业务系统,重新获得Oracle Session。
避免方案:
不要在系统运行过程中,对Package重新编译。
传说中的04068啊,这个错误在开发中比较容易见到,简单说,就是你与数据库建立链接后,这个package被编译过,然后你再去调用这个包,会报这个错误,但只会报一次。
所以比较常见的做法,就是程序catch捕获异常后,判断错误是否是04068,如果是,重新调用一次,第二次调用就没问题了。