gpt4 book ai didi

oracle - PL/SQL 包失效

转载 作者:行者123 更新时间:2023-12-03 10:54:25 25 4
gpt4 key购买 nike

我有一个使用包 (PKG_MY_PACKAGE) 的脚本。我将更改该包中查询中的某些字段,然后重新编译它(我不更改或编译任何其他包)。我运行脚本并收到一个错误,看起来像

ORA-04068: 包的现有状态已被丢弃
ORA-04061: 包体“USER3.PKG_MY_PACKAGE”的现有状态已失效
ORA-04065: 未执行、更改或删除包体“USER3.PKG_MY_PACKAGE”
ORA-06508:PL/SQL:找不到正在调用的程序单元:“USER3.PKG_MY_PACKAGE”
ORA-06512:在第 34 行

我再次运行脚本(不更改系统中的任何其他内容)并且脚本成功执行。

我认为当我在执行脚本之前进行编译时,可以修复任何无效的引用。这是 100% 可重现的,我使用这个脚本越多,它就越烦人。什么可能导致这种情况,什么会解决它?

(oracle 10g,使用 PL/SQL Developer 7)

最佳答案

背景
existing state of packages has been discarded 意味着你的包有某种状态。

这是由存储在包主体中的全局变量引起的。
直到 11.2.0.2,常量也会导致这种行为(参见 documentation )。

由于该包已在您的 session 中使用,因此 Oracle 假定此状态与您相关。其中一些变量现在可能具有不同的值,当您重新编译 Body 时,这些值将被重置。

抛出此异常,以便您的客户知道他们不能再依赖这些变量。

解决方案

  • 如果可能,从包体中删除所有全局变量和常量(11gR2 之前)
  • DETERMINISTIC 函数替换全局变量(如 this answer 所建议的)
  • 使用 PRAGMA SERIALLY_REUSABLE 定义包会导致 Oracle 在每次调用服务器时重新初始化全局变量。
  • 在再次调用包之前关闭 session 并重新连接。
  • 手动重置状态(参见 Paul James' answer )
  • 关于oracle - PL/SQL 包失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2502722/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com