oracle job调用存储过程插入数据比手动执行插入的数据要少很多
本帖最后由 jxjinfocus 于 2013-01-14 12:37:31 编辑
oracle JOB 调用存储过程,存储过程查询 昨日数据 进行统计,并将统计结果插入到一张统计表。
此JOB已正常工作数月。
数据库为基于Unix Oracle10.2, 而且是两台数据库服务器,就是若坏了其中任意一台后,另一台ORACLE服务器仍然可以正常工作。后来有一台ORACLE服务器坏了,似乎是坏了一台以后,很多JOB就工作不正常了。
JOB仍然可以正常运行,在JOB的日志中可以查询到JOB均正常完成。但是统计数据却少了很多。只入库了几条至几十条统计数据;但是手动执行存储过程却可以入库几百条统计数据。数据丢失严重。
后修改存储过程,详细记录运行日志,参数值等,均显示无任何异常,可JOB在凌晨5点执行后,统计数据却只有几条至几十条。用那些参数来手动查询或者手动执行存储过程的话 都是有几百条统计数据。
JOB也重建了,也改用dbms_scheduler 来建JOB了。所有能想到的测试方法 都已试过了,均显示正常,找不到任何异常。可偏偏JOB调用存储过程在凌晨执行的话,只产生几条到几十条数据在统计中间表中……
只剩下我没有在凌晨5点进行手动测试了……
Job:
BEGIN
SYS.DBMS_SCHEDULER.DROP_JOB
(job_name => 'EMP.JOB_STPOLLUTANTSTATSOURCE');
END;
/
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,start_date => TO_TIMESTAMP_TZ('2013/01/09 05:00:00.000000 +08:00','yyyy/mm/dd hh24:mi:ss.ff tzr')
,repeat_interval => 'Freq=Daily;Interval=1;ByHour=5'
,end_date => NULL
,job_class => 'DEFAULT_JOB_CLASS'
,job_type => 'STORED_PROCEDURE'
,job_action => 'P_ST_POLLUTANT_STAT_SOURCE_2'
,comments => '污染物日数据统计源统计,缓存数据到表ST_POLLUTANT_STATISTIC_SOURCE'
);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'RESTARTABLE'
,value => FALSE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'LOGGING_LEVEL'
,value => SYS.DBMS_SCHEDULER.LOGGING_RUNS);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'MAX_FAILURES');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'MAX_RUNS');
BEGIN
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'STOP_ON_WINDOW_CLOSE'
,value => FALSE);
EXCEPTION
-- could fail if program is of type EXECUTABLE...
WHEN OTHERS THEN
NULL;
END;