我有一个Oracle 10G安装(Oracle数据库10g企业版10.2.0.3.0版 - Prod),以及一个通过JDBC连接在oracle中调用存储过程和函数的java Web应用程序。 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
下次调用时,一切都按照应有的方式运行。关于为什么以及如何防止这种情况发生的任何想法?
答案 0 :(得分:4)
这是具有状态的包的正常行为,即它们具有主体变量。编译包时,必须丢弃现有状态,并且在收到ORA-04068错误之前使用该包的所有会话(编译包的错误除外)。
由于您有一个Web应用程序,我假设它使用一个连接池来保持会话活动。因此,如果他们以前使用过包装,他们都会受到影响。
一种解决方法是调用DBMS_SESSION.RESET_PACKAGE
,它会丢弃当前会话的所有包的状态。另一个是检查是否可以摆脱会话状态,这在连接池中有些问题。
答案 1 :(得分:0)
我认为没有任何方法可以解决这个问题,而不必删除并重新创建会话。
查看this