包的现有状态已失效

时间:2015-10-03 07:52:47

标签: oracle plsql

我正面临这个错误。

我有两个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但仍然给我同样的错误

非常感谢

2 个答案:

答案 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);    端;

  • 最后一个选项如果以上都不起作用,则从包中删除所有过程/函数,添加新函数并尝试从触发器运行您的函数。检查这是否有效然后你的包是特殊锁。添加新功能后,它的状态将再次有效,然后您可以添加所有实际的功能/触发器并删除新添加的功能。