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

本来应该一分钟一次的job,为何实际跑出来变成一分钟零一秒或者零二秒了?

创建测试表
  SQL>   create   table   TEST(a   date);
  
  表已创建。
  
  创建一个自定义过程
  SQL>   create   or   replace   procedure   MYPROC   as
   2 begin
   3 insert   into   TEST   values(sysdate);
   4 end;
   5 /
  
  过程已创建。
  
  创建JOB
  SQL>   variable   job1   number;
  SQL>  
  SQL>   begin
   2 dbms_job.submit(:job1, 'MYPROC; ',sysdate, 'sysdate+1/1440 ');  --每天1440分钟,即一分钟运行test过程一次
   3 end;
   4 /


跑出来的结果是这样的:

2007-05-21   17:47:55  
2007-05-21   17:48:56  
2007-05-21   17:49:58  
2007-05-21   17:50:59  


------解决方案--------------------
设置JOB执行时间,一般都用trunc(),你改了试试。
------解决方案--------------------
trunc(sysdate, 'mi ') + 1/1440
------解决方案--------------------
应该就是因为除法四舍五入的问题
------解决方案--------------------
job 设置的是整点跑,但是也要看当时的调度,一般未必就是整点执行了,可能会晚那么几秒钟吧。而next_time 的时间就是在上一次job 开始的时间上加上interval 的,这样的话,伴随着job 执行次数的越来越多,下次执行时间和整点的差异会越来越大,因此,一般会采用trunc 的方式来使下次执行时间在期望的整点执行。