首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

oracle job调用存储过程安插数据比手动执行插入的数据要少很多

2013-03-26 
oracle job调用存储过程插入数据比手动执行插入的数据要少很多本帖最后由 jxjinfocus 于 2013-01-14 12:37

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

热点排行