日期:2014-05-17  浏览次数:21171 次

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...