我在Oracle Enterprise 12c中有一个存储过程。该程序正在调用100多个子过程来截断表并重新插入(ETL)。
Master Proc IS
BEGIN
CHILD1;
CHILD2;
CHILD3;
ETC...
END;
此过程将按要求每4小时执行一次。问题是有时我们会遇到一些错误:
ORA-04065:未执行,更改或删除
ORA-04065:未执行,更改或删除了存储过程“子proc1”
ORA-06508:PL / SQL:找不到正在被调用的程序单元:“ OD
但是,即使我在得到错误后重新执行程序仍然没有任何错误地重新执行,这似乎可以在下一次加载中自行解决。然后一段时间后,我们通过随机存储过程再次得到错误,第一次是child1然后child2,然后再次是child1。
有什么办法解决或避免这种错误吗?
注意:不使用软件包。只是独立的sp。
答案 0 :(得分:0)
某些事情使调用链中的PL / SQL对象(包,类型,过程,函数)无效,也许是删除并重新创建了它所引用的表,这迫使运行时引擎在下一次调用时对其进行重新编译。如果程序包具有状态(全局变量或游标),则状态将在重新编译时丢失,因此您会在堆栈中某处出现ORA-04068: existing state of packages has been discarded
的错误ORA-04065
。
我不确定您怎么会遇到两个ORA-04065
错误并且没有ORA-04068
的错误,因为我希望ORA-04068
位于顶部,例如:
SQL> exec dbms_output.put_line(ora_04065_demo.this_creates_package_state)
BEGIN dbms_output.put_line(ora_04065_demo.this_creates_package_state); END;
*
ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package "WILLIAM.ORA_04065_DEMO" has been invalidated
ORA-04065: not executed, altered or dropped package "WILLIAM.ORA_04065_DEMO"
ORA-06508: PL/SQL: could not find program unit being called: "WILLIAM.ORA_04065_DEMO"
ORA-06512: at line 1