Oracle DBMS_SCHEDULE для работы в 8:00, 12:00, 16:00 и 20:00 каждый день недели - PullRequest
3 голосов
/ 26 сентября 2019

Я не уверен, как справиться с использованием Oracle DBMS_SCHEDULER.Меня попросили запустить конкретное задание процедуры PL / SQL по адресу:

8AM, 12PM, 4PM and lastly at 8PM every day of the week 

, а затем снова запустить его на следующий день в то же время снова по адресу: 8AM, 12PM, 4PM and lastly at 8PM.

Я понимаю, что сначала мне нужно создать расписание, но я не знаю, какой должна быть настройка частоты, например:

dbms_scheduler.create_schedule( schedule_name   => 'MY_JOB',
                                repeat_interval => 'FREQ=DAILY;BYHOUR=8;BYMINUTE=00'
                                start_date      => SYSTIMESTAMP
                              );

1 Ответ

3 голосов
/ 26 сентября 2019

Вам не нужно создавать именованный ГРАФИК (но вы можете сделать это, если хотите), вы можете поместить интервал повторения непосредственно в работу:

DBMS_SCHEDULER.CREATE_JOB (
   job_name        => ...
  ,start_date      => SYSTIMESTAMP
  ,repeat_interval => 'FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00'

Примечание, для работ с частотой меньшечем ежедневно, вы должны учитывать летнее время.Часовой пояс SYSTIMESTAMP - это часовой пояс операционной системы сервера базы данных, очень часто он устанавливается как статическое смещение UTC (например, +02:00).Чтобы принять во внимание переход на летнее время, это смещение UTC меняется два раза в год.

Если задания должны соответствовать корректировкам перехода на летнее время, необходимо указать название региона для часового пояса start_date.Например, вы можете сделать

DBMS_SCHEDULER.CREATE_JOB (
   job_name        => ...
  ,start_date      => SYSTIMESTAMP AT TIME ZONE 'Europe/Zurich'
  ,repeat_interval => 'FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00'

Взгляните на этот блок PL / SQL, чтобы увидеть разницу.

DECLARE
   next_run_date TIMESTAMP WITH TIME ZONE;
   start_date TIMESTAMP WITH TIME ZONE; 
BEGIN
   DBMS_OUTPUT.PUT_LINE('Static UTC offset:');
   start_date := TIMESTAMP '2019-10-26 00:00:00 +02:00';
   FOR i IN 1..10 LOOP
      DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00', start_date, next_run_date, next_run_date);
      DBMS_OUTPUT.PUT_LINE(next_run_date AT LOCAL);
   END LOOP;

   DBMS_OUTPUT.PUT_LINE('Time zone region name:');
    next_run_date := NULL;
   start_date := TIMESTAMP '2019-10-26 00:00:00 Europe/Zurich';
   FOR i IN 1..10 LOOP
      DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00', start_date, next_run_date, next_run_date);
      DBMS_OUTPUT.PUT_LINE(next_run_date AT LOCAL);
   END LOOP;

END;

Static UTC offset:
2019-10-26 08:00:00.000 +02:00
2019-10-26 12:00:00.000 +02:00
2019-10-26 16:00:00.000 +02:00
2019-10-26 20:00:00.000 +02:00
2019-10-27 07:00:00.000 +01:00
2019-10-27 11:00:00.000 +01:00
2019-10-27 15:00:00.000 +01:00
2019-10-27 19:00:00.000 +01:00
2019-10-28 07:00:00.000 +01:00
2019-10-28 11:00:00.000 +01:00

Time zone region name:
2019-10-26 08:00:00.000 +02:00
2019-10-26 12:00:00.000 +02:00
2019-10-26 16:00:00.000 +02:00
2019-10-26 20:00:00.000 +02:00
2019-10-27 08:00:00.000 +01:00
2019-10-27 12:00:00.000 +01:00
2019-10-27 16:00:00.000 +01:00
2019-10-27 20:00:00.000 +01:00
2019-10-28 08:00:00.000 +01:00
2019-10-28 12:00:00.000 +01:00

См. Повторите интервалы и летнее время дляподробнее

...