我有一个Oracle 10G安装(Oracle数据库10g企业版10.2.0.3.0版 - Prod),以及一个java Web应用程序,它通过JDBC连接调用oracle中的存储过程和函数 . SP和功能是包的一部分 . 第一次调用SP或函数时,在成功编译包之后,我得到以下错误:
(我用“#schema-name# . #package-name#”替换了我们的模式名称和包名称)
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "#schema-name#.#package-name#" has been invalidated
ORA-04065: not executed, altered or dropped package body "#schema-name#.#package-name#"
ORA-06508: PL/SQL: could not find program unit being called: "#schema-name#.#package-name#"
ORA-06512: at "#schema-name#.#package-name#", line 5393
ORA-06512: at line 1
下次它被调用时,一切都按照应有的方式运行 . 关于为什么以及如何防止这种情况发生的任何想法?
2 回答
这是具有状态的包的正常行为,即它们具有主体变量 . 编译包时,必须丢弃现有状态,并且在使用该包之前的所有会话都会收到ORA-04068错误(编译包的错误除外) .
由于您有一个Web应用程序,我假设它使用一个连接池来保持会话活动 . 所以如果他们之前使用过包装,他们都会受到影响 .
一种解决方法是调用
DBMS_SESSION.RESET_PACKAGE
,它会丢弃当前会话的所有包的状态 . 另一个是检查是否可以摆脱会话状态,这与连接池有些问题 .如果没有删除并重新创建会话,我认为没有办法解决这个问题 .
看看this