读书人

oracle job调用存储过程安插数据比手动

发布时间: 2013-03-26 21:10:04 作者: rapoo

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;


SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'JOB_PRIORITY'
,value => 3);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'SCHEDULE_LIMIT');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'EMP.JOB_STPOLLUTANTSTATSOURCE'
,attribute => 'AUTO_DROP'
,value => TRUE);

SYS.DBMS_SCHEDULER.ENABLE
(name => 'EMP.JOB_STPOLLUTANTSTATSOURCE');
END;
/



存储过程中记录的日志:
oracle job调用存储过程安插数据比手动执行插入的数据要少很多
JOB运行的记录数太少了

JOB自身的记录全部显示正常结束
oracle job调用存储过程安插数据比手动执行插入的数据要少很多

oracle?job?数据 oracle?job?数据偏少
[解决办法]
写了好多,LZ辛苦了
[解决办法]
你自己去再建一个结构完全相同,但是名字不一样的表,
用服务器的语言写一个定时器,凌晨4点58调用存储过程,
只是把表换一下,然后和任务的结果两相对比不就完了
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html

读书人网 >oracle

热点推荐