Как отправить dbms_job, чтобы начать в 06:00 и запускать каждый час, понедельник

Как я могу установить интервал для dbms_job, который должен начинаться в 06:00 и запускаться каждый час, понедельник.

X NUMBER:=1102745;    
BEGIN
  SYS.DBMS_JOB.INTERVAL
  (X,
   'next_day(SYSDATE,''MONDAY'')+1/24'
   );
END;

Но этот код работает каждый понедельник 01:00.

2 ответа

Решение

Вы можете использовать современный SCHEDULER JOB вместо старой (и устаревшей) DBMS_JOB

DBMS_SCHEDULER.CREATE_JOB(
       job_name        => 'X'
      ,start_date      => SYSTIMESTAMP
      ,repeat_interval => 'FREQ=HOURLY;BYHOUR=06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23;BYMINUTE=0;BYSECOND=0;BYDAY=Mon'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => ...
      ,job_action      => ...
    );

Вы можете проверить интервал повторения с этим:

DECLARE
    next_run_date TIMESTAMP;
BEGIN
    FOR i IN 1..50 LOOP
        DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=HOURLY;BYHOUR=06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23;BYMINUTE=0;BYSECOND=0;BYDAY=Mon', NULL, next_run_date, next_run_date);
        DBMS_OUTPUT.PUT_LINE ( next_run_date );
    END LOOP;
END;
X NUMBER:=1102745;    
BEGIN
  SYS.DBMS_JOB.INTERVAL
  (X,'next_day(SYSDATE-1,'||to_char(TRUNC(sysdate, 'DAY'), 'DAY')||')+1/24'
   );
END;
Другие вопросы по тегам