今早检查月底Job执行情况,发现一个Job执行失败,错误如下:
ORA-04068: existing state of packages
ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "US.STAT_SC"
ORA-06508: PL/SQL: could not find program unit being called: "US.STAT_SC"
ORA-06512: at line 20 has been discarded
ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "US.STAT_SC"
ORA-06508: PL/SQL: could not find program unit being called: "US.STAT_SC"
ORA-06512: at line 20 has been discarded
检查该job的JOB_ACTION,内容如下:
begin
...
proc_1(yer,mon);
...
stat_sc(yer,mon);
...
end;
其中 proc_1 就是为了后面的统计而准备数据,由于数据量比较大,采用了drop table后再 create table 的方式生成中间表。而后面stat_sc之类的procedure都是基于那些drop掉再create的表。由于后面存储过程都是依赖于 proc_1 中所涉及的表,同时当前的存储过程的状态为available,那么当 proc_1 中的表被drop掉后,则后面的存储过程马上被设置为unavailable,即使这时再重新创建了相应的表,此时后面的存储过程也不会自动地设置为available(因为其不会自行编译),除非人工进行编译该存储过程。
到了这里,问题应该清楚了,解决办法有三:
1、在 proc_1 中不采用drop再create的方式;
2、在后面依赖的procedure中,通过execute immediate 方式执行相关表的sql;
3、把 proc_1 单独放到一个Job中执行,这个方法最简单,唯一需要注意的是时间顺序。
悲剧了,这个job的所有事情都得手动做了,时间点和其他报表还不一致,导致报表之间数据有出入。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-712524/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9399028/viewspace-712524/