成功编译后,第一次调用存储过程失败。甲骨文 10g

jwo*_*rin 3 oracle stored-procedures jdbc

我有一个 Oracle 10G 安装(Oracle Database 10g Enterprise Edition Release 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
Run Code Online (Sandbox Code Playgroud)

下一次调用它时,一切都会按照它应该的方式运行。关于为什么以及如何防止这种情况发生的任何想法?

Cod*_*odo 5

这是具有状态的包的正常行为,即它们具有主体变量。编译包时,必须放弃现有状态,所有使用过该包的会话都会收到 ORA-04068 错误(编译该包的会话除外)。

由于您有一个 Web 应用程序,我假设它使用一个连接池来保持会话处于活动状态。所以如果他们之前使用过这个包,他们都会受到影响。

一种解决方法是调用DBMS_SESSION.RESET_PACKAGE,它会丢弃当前会话的所有包的状态。另一种是检查是否可以摆脱会话状态,这与连接池结合起来有些问题。