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"
我怎样才能将其包围?
答案 0 :(得分:4)
我的直接猜测是你的包也会丢弃或引用你正在创建的表。因此,在某些方面,程序包可能正在尝试引用不存在的表。
事件的顺序可能是这样的:
简单的答案不是在代码中创建或删除表。请改为创建global temporary table。这使表格始终存在。
更糟糕的选择是将execute immediate
中可能存在或不存在的每个使用该表的调用包装起来。
如果我完全错了,那么您需要调查您的包裹无效的原因并发布结果。它无效的事实并不重要。
答案 1 :(得分:3)
删除任何对象会导致引用它的所有对象都被标记为无效。引用此无效对象的对象也可以标记为无效,依此类推。所以,似乎你的软件包引用了这个表,或者取决于它所做的事情。
我必须承认我理解Oracle抛出ORA-04061错误的原因,并且在您第一次调用无效的包时不会自动重新验证包。但是,我不认为这是一个问题。在应用程序运行时,您不应该真正创建或删除表。你为什么需要这样做?
如果您正在寻找一种比DELETE FROM my_table
更快的清空表格的方法,请使用TRUNCATE TABLE my_table
。请注意,TRUNCATE
是DDL,例如CREATE
,ALTER
和DROP
,因此您需要将调用包装在EXECUTE IMMEDIATE
中。