database - ORA-04065 : not executed, 更改或删除存储过程

标签 database oracle plsql

我在 Oracle Enterprise 12c 中有一个存储过程。该程序正在调用 100 多个子过程来截断表并重新插入 (ETL)。

Master Proc IS
BEGIN
  CHILD1;
  CHILD2;
  CHILD3;
   ETC...
END;

此过程按要求每 4 小时执行一次。问题是有时我们会遇到一些错误:

ORA-04065: 未执行、更改或删除
ORA-04065: 未执行、更改或删除存储过程“child proc1”
ORA-06508: PL/SQL: 找不到被调用的程序单元: "OD

但这似乎在下一次加载时自行解决,即使我在收到错误后重新执行程序也没有任何错误地完成。然后一段时间后我们再次使用随机存储过程收到错误,第一次是 child1 然后child2 然后是 child1。

知道如何解决或避免此错误吗?

注意:不使用包。只是独立的 sp。

最佳答案

某些东西正在使调用链中的 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

关于database - ORA-04065 : not executed, 更改或删除存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53561073/

相关文章:

sql - SQLite:使用ID和哈希值合并两个表,其中得到的ID来自所选表

sql - 从一个表中获取行,并从相关表中获取 COUNT

mysql - SQL如何将列追加到单行结果集?

sql - 根据列值对行进行排名/计数

c - 嵌入式 SQL FETCH

sql - 是否可以在 PLSQL/Oracle 中动态创建外部表

java - 如何将 List 从 java 传递到 Oracle Procedure?

php - foreach在laravel中加入并选择

mysql - 数据库与 fstream 访问

oracle - 将 PL/SQL 脚本转换为存储过程