Что происходит, когда процедура, выполняемая JOB, не завершена, когда для JOB снова наступает время выполнить ее? - PullRequest
4 голосов
/ 22 мая 2019

Я хочу знать, что происходит, когда процедура выполняется в задании, и до того, как она завершится, нужно, чтобы задание вызвало следующее выполнение процедуры.Вот задание, которое я создал:

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 ]

5 голосов
/ 22 мая 2019

Если вы используете (устаревшие) задания, т.е. DBMS_JOB

Время начала следующего выполнения определяется по завершении текущих заданий. Если вы указали интервал как SYSDATE+30/86400, тогда он не означает : «Задание выполняется каждые 30 секунд».

Это означает: «Следующие задания начинаются через 30 секунд после завершения предыдущего задания».

Если вы используете задания планировщика, т.е. DBMS_SCHEDULER

Сразу после запуска задания repeat_interval (например, FREQ=SECONDLY;INTERVAL=30) оценивается для определения следующего запланированного времени выполнения задания. Хотя это может произойти, пока задание еще выполняется, новый экземпляр задания не запускается, пока не завершится текущий. См. Об установке интервала повторения

Таким образом, это означает: если работа длится дольше 30 секунд, то новая работа начнется сразу после завершения предыдущей работы.

1 голос
/ 22 мая 2019

Ничего не происходит!
Только когда анонимный PL / SQL-блок внутри параметра " what " завершается, следующая дата рассчитывается по параметру interval

...