在每次后续调用中都会使Oracle包无效

本文关键字:包无效 Oracle 无效 调用 | 更新日期: 2023-09-27 18:28:10

ODP.Net方法调用一个打包的存储过程,每次调用该存储过程时都会重新创建一个表。在随后的每次调用中,它都会抛出错误

ORA-04061: existing state of package body "SAAP.PRICEWORX" has been invalidated
ORA-06508: PL/SQL: could not find program unit being called: "SAAP.PRICEWORX"

我该如何绕过这个?

在每次后续调用中都会使Oracle包无效

我的直接猜测是,您的包也会删除或引用您正在创建的表。因此,在某些情况下,包可能试图引用一个不存在的表。

事件的顺序可能是这样的:

  1. 表已存在
  2. 使用表格
  3. 删除表格
  4. 请尝试再次使用表-包无效,因为表已不存在
  5. 创建表-一切都恢复正常

简单的答案是不要在代码中创建或删除表。改为创建全局临时表。这使得桌子总是在那里。

更糟糕的选择是包装使用execute immediate中可能存在或不存在的表的每个调用。

如果我完全错了,那么你需要调查为什么你的包裹无效,并公布结果。它无效这一事实意义不大。

删除任何对象都会导致引用该对象的所有对象被标记为无效。引用这个无效对象的对象也可以被标记为无效,依此类推。所以,看起来要么你的包引用了这个表,要么依赖于它。

我必须承认,我理解Oracle在第一次调用无效包时抛出ORA-04061错误并且没有自动重新验证包的原因。然而,我不认为这是个问题。您不应该在应用程序运行时创建或删除表。你为什么需要这样做?

如果您正在寻找比DELETE FROM my_table更快的清空表的方法,请使用TRUNCATE TABLE my_table。请注意,TRUNCATE是DDL,与CREATEALTERDROP类似,因此需要将对它的调用封装在EXECUTE IMMEDIATE中。