我正面临这个错误。
我有两个Schema Schema A和Schema B
模式B包含一个表my_table,其中的值正在插入。
还有一个触发器my_trigger为schemaB中的my_table为每行编写
CREATE OR REPLACE TRIGGER schemaB.my_trigger
ON schemaA.my_table
FOR EACH ROW
BEGIN
IF INSERTING THEN
schemaA.my_package.my_procedure (:NEW.field_A,NEW.field_B, :NEW.field_C);
END IF;
EXCEPTION
WHEN OTHERS THEN
Insert into my_log(DBMS_UTILITY.format_error_stack,sysdate);
END my_trigger;
/ AFTER INSERT
写在schemaB的my_table上的这个触发器正在调用一个存在于Schema A中的过程。
但是当触发器被触发时,我在日志中收到以下错误
ERROR: ORA-04061: existing state of package "schemaA.my_package" has been invalidated
ORA-04065: not executed, altered or dropped package "schemaA.my_package"
ORA-06508: PL/SQL: could not find program unit being called: "schemaA.my_package"
ORA-06512: at "schemaB.my_trigger", line 17 10/1/2015 6:38:07 PM
schemaA中的过程也被声明为PRAGMA_AUTONOMOUS_TRANSACTION
这是一些补助问题,因为我检查了所有补助金,我检查了触发器和程序的依赖关系 一切似乎都有效。你能帮忙吗?
我尝试在调用包中使用Pragma serially_reusable但仍然给我同样的错误
非常感谢
答案 0 :(得分:0)
阅读此博客条目,了解有关错误的更多信息 - http://oraclequirks.blogspot.co.il/2007/03/ora-04061-existing-state-of-package-has.html
附加代码schemaA.my_package会提供更好的方法来帮助您解决问题,但如果您使用全局变量,那么问题的解决方案可能就在这篇文章中。
答案 1 :(得分:0)
您可能遇到的问题是:
您呼叫的程序包/程序无效 在此all_objects视图中检查此查询是否包含包或包中使用的对象的条目
从all_objects中选择*,其中status =' INVALID'和所有者=' SCHEMA_NAME';
检查您的包是否有全局变量?如果是,则检查这些变量是否未被任何其他会话更改
在脚本下运行以编译架构中的所有对象
开始 dbms_utility.compile_schema(' SCHEMA_NAME',FALSE); 端;