当作业需要再次执行时,由作业执行的过程未完成时会发生什么情况?

时间:2019-05-22 19:33:56

标签: sql oracle plsql scheduled-tasks job-scheduling

我想知道当通过作业执行过程时以及完成之前发生的事情是该作业调用该过程的下一次执行的时间。这是我创建的工作:

DECLARE
  X NUMBER;
    BEGIN
      SYS.DBMS_JOB.SUBMIT
       (
          job        => x
         ,what       => 'BEGIN PKG_DISTRIBUIDOR_SCHEDULER.PRC_DISTRIBUYE_TRANSACCIONES(5000); END;'
         ,next_date  => to_date(sysdate,'dd/mm/yyyy hh24:mi:ss')
         ,interval   => 'SYSDATE+30/86400'
         ,no_parse   => FALSE
       );
       DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));   
       COMMIT;
   END;

如您所见,作业每30秒执行一次。因此,如果我的过程(PRC_DISTRIBUYE_TRANSACCIONES)延迟超过30秒,那么在这种情况下该工作做什么?

2 个答案:

答案 0 :(得分:5)

如果您使用(不推荐使用的)旧工作,即DBMS_JOB

当前作业完成时,确定下一次执行的开始时间。 如果将间隔指定为SYSDATE+30/86400,则它不是是指:“作业每30秒运行一次”。

这表示:“下一个作业在上一个作业完成后30秒开始。”

如果您使用调度程序作业,即DBMS_SCHEDULER

在作业开始后,立即评估repeat_interval(例如FREQ=SECONDLY;INTERVAL=30),以确定该作业的下一个计划执行时间。尽管这可能在作业仍在运行时到达,但作业的新实例要等到当前实例完成后才能启动。参见About Setting the Repeat Interval

因此,它的意思是:如果作业持续时间超过30秒,则新作业将在前一个作业完成后立即开始。

答案 1 :(得分:1)

什么都没发生!
仅当“ 什么”参数中的匿名PL / SQL块结束时,才根据 interval 参数

计算下一个日期。