当 JOB 执行的过程没有完成而 JOB 再次执行它时会发生什么?

What happens when a procedure executed by a JOB is not finished when is time for the JOB to execute it again?

我想知道当一个过程通过一个作业执行时会发生什么,在它完成之前是作业调用下一个过程执行的时间。这是我创建的作业:

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 秒,在这种情况下该作业会做什么?

没有任何反应!
只有当匿名PL/SQL块在“what”参数内完成时,才会根据interval参数

计算下一个日期

如果您使用(旧的已弃用的)工作,即 DBMS_JOB

下一次执行的开始时间以当前作业完成为准。 如果您将间隔指定为 SYSDATE+30/86400 那么它 并不 表示:“作业每 30 秒运行一次。”

这意味着:“下一个作业在上一个作业完成后 30 秒开始。”

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

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

所以这意味着:如果作业持续时间超过 30 秒,则新作业将在上一个作业完成后立即开始。