首页 文章

成功编译后,首先调用存储过程失败 . Oracle 10g

提问于
浏览
2

我有一个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 回答

  • 4

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

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

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

  • 0

    如果没有删除并重新创建会话,我认为没有办法解决这个问题 .

    看看this

相关问题