在运行一个过程是报了一个ORA-4068错误。虽然问题简单而且解决过程也不复杂,但是要真正理解错误产生的原因,还是要对概念有比较清晰的理解
下面用一个简单的例子来重现错误:
SQL> create table t as select * from emp;
表已创建。
SQL> create or replace procedure p_recreate_tb as
2 begin
3 execute immediate 'drop table t';
4 execute immediate 'create table t as select * from emp';
5 end;
6 /
过程已创建。
SQL> create or replace procedure p_insert_tb as
2 begin
3 insert into t select * from t;
4 end;
5 /
过程已创建。
SQL> begin
2 p_recreate_tb;
3 p_insert_tb;
4 end;
5 /
begin
*
第 1 行出现错误:
ORA-04068: 已丢弃程序包 的当前状态
ORA-04065: 未执行, 已变更或删除 stored procedure "SCOTT.P_INSERT_TB"
ORA-06508: PL/SQL: 无法找到正在调用 : "SCOTT.P_INSERT_TB" 的程序单元
ORA-06512: 在 line 3
上面建立了两个过程,在第一个过程p_recreate_tb中,通过动态语句drop table t,然后通过动态语句create table as select 来重建t表。
第二个过程p_insert_tb则更简单,就是根据t表的内容实现自我复制。
将两个存储过程放在同一个匿名块中调用,就会出现上面的ORA-04068错误。
如果单独执行两个过程,则不会报错:
SQL> exec p_recreate_tb;
PL/SQL 过程已成功完成。
SQL> exec p_insert_tb;
PL/SQL 过程已成功完成。
看到这个ORA-04068错误,首先想到的是p_recreate_tb过程对表进行删除表重建的操作,这会导致所有和这个表相关的存储过程变为invalid状态