Задание планировщика на Oracle выполняется не каждую секунду - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть заданное c задание планировщика в Oracle, которое нужно запускать каждую секунду.

Я пытался создать это (используя процедуру):

begin
  sys.dbms_scheduler.create_job(job_name            => 'WBC6_PUBLIC.TESTE',
                                job_type            => 'STORED_PROCEDURE',
                                job_action          => 'proc_insert_data',
                                start_date          => to_date('19-02-2020 09:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                                repeat_interval     => 'Freq=Secondly;Interval=1',
                                end_date            => to_date(null),
                                job_class           => 'DEFAULT_JOB_CLASS',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '');
end;
/

И это (с помощью PLSQL_BLOCK):

begin
  sys.dbms_scheduler.create_job(job_name            => 'WBC6_PUBLIC.TESTE',
                                job_type            => 'PLSQL_BLOCK',
                                job_action          => 'insert into my_table (date) values (sysdate);',
                                start_date          => to_date('19-02-2020 09:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                                repeat_interval     => 'Freq=Secondly;Interval=1',
                                end_date            => to_date(null),
                                job_class           => 'DEFAULT_JOB_CLASS',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '');
end;
/

Но результат тот же, задание выполняется каждые ~ 4 секунды.

Есть ли параметр или что-то, что я могу сделать, чтобы запускать каждую секунду

1 Ответ

0 голосов
/ 21 февраля 2020

Я пробовал что-то подобное раньше, и если процедура занимает или может занять больше, чем интервал, то это невозможно. Альтернативой является запуск кода в непрерывном режиме l oop со встроенным механизмом останова (например, проверка stop_table.stop_column для условия «остановка»). Например:

BEGIN
  LOOP 
     proc_insert_data;               /* run your insert */
     sys.DBMS_SESSION.sleep(1);      /* Pause for 1 second. */
     stop_condition := stop_condition + 1;
     EXIT WHEN stop_condition = 900; /* exit after 15 min  OR some other mechanism of  your choice */
   END LOOP;
END;
/ 
...