在每次后续调用中都会使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"
我该如何绕过这个?
我的直接猜测是,您的包也会删除或引用您正在创建的表。因此,在某些情况下,包可能试图引用一个不存在的表。
事件的顺序可能是这样的:
- 表已存在
- 使用表格
- 删除表格
- 请尝试再次使用表-包无效,因为表已不存在
- 创建表-一切都恢复正常
简单的答案是不要在代码中创建或删除表。改为创建全局临时表。这使得桌子总是在那里。
更糟糕的选择是包装使用execute immediate
中可能存在或不存在的表的每个调用。
如果我完全错了,那么你需要调查为什么你的包裹无效,并公布结果。它无效这一事实意义不大。
删除任何对象都会导致引用该对象的所有对象被标记为无效。引用这个无效对象的对象也可以被标记为无效,依此类推。所以,看起来要么你的包引用了这个表,要么依赖于它。
我必须承认,我理解Oracle在第一次调用无效包时抛出ORA-04061错误并且没有自动重新验证包的原因。然而,我不认为这是个问题。您不应该在应用程序运行时创建或删除表。你为什么需要这样做?
如果您正在寻找比DELETE FROM my_table
更快的清空表的方法,请使用TRUNCATE TABLE my_table
。请注意,TRUNCATE
是DDL,与CREATE
、ALTER
和DROP
类似,因此需要将对它的调用封装在EXECUTE IMMEDIATE
中。