Как запланировать задания СУБД Oracle в окне

Я хочу создать задание СУБД Oracle, которое выполняется каждый будний день (не по выходным) с 09:00 до 20:00 каждые 10 минут. Интересно, могу ли я сделать это в параметре FREQ определения задания или мне нужно создать файл New Maintenance Window.

Кажется, что с предложенным решением задание выполняется только в 9 и 20, и после первого выполнения, когда я запускаю этот запрос

select owner, job_name, next_run_date 
from dba_scheduler_jobs 
where JOB_NAME = 'GET_INVOICES_JOB';

Я получил 09/10/17 20:01:27,000000000 EUROPE/MADRID

'freq=minutely; interval=10; byhour=9,20; byday=MON,TUE,WED,THU,FRI; exclude=Company_Holidays; bysetpos=-1'

person en Lopes    schedule 07.10.2017    source источник
comment
Какая частота с 9:00 до 20:00?   -  person Cyrille MODIANO    schedule 07.10.2017
comment
Я хочу, чтобы задание выполнялось каждые 10 минут в будние дни с 9:00 до 20:00...   -  person en Lopes    schedule 09.10.2017


Ответы (2)


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

begin
dbms_scheduler.create_job (
   job_name           =>  'jb_en_lopes',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'pr_en_lopes',
   start_date         =>  '09-oct-2017 09:00:00 am',
   repeat_interval    =>  'freq=minutely; interval=10; byhour=9,10,11,12,13,14,15,16,17,18,19,20; byday=MON,TUE,WED,THU,FRI;',
   enabled            =>  true);
end;

Когда этот планировщик отвечает, я получаю следующие результаты:

select * 
  from dba_scheduler_job_log l
 where l.job_name = 'JB_EN_LOPES'
 order by l.log_date desc;

 LOG_ID LOG_DATE                            OPERATION   STATUS

1051594 10-OCT-17 09.59.01.197420 AM +03:00    RUN      SUCCEEDED  
1051592 10-OCT-17 09.58.02.229724 AM +03:00    RUN      SUCCEEDED  
1051590 10-OCT-17 09.57.03.177907 AM +03:00    RUN      SUCCEEDED  
1051588 10-OCT-17 09.56.01.197341 AM +03:00    RUN      SUCCEEDED

Где :

select owner, job_name, next_run_date                                  
  from dba_scheduler_jobs                                               
 where JOB_NAME = 'JB_EN_LOPES'; 

 OWNER    JOB_NAME       NEXT_RUN_DATE

 myschema JB_EN_LOPES   10-OCT-17 08.00.00.194958 PM +03:00

Обновление:

Если у вас нет доступа к представлениям dba_, рассмотрите возможность замены этих префиксов на user_ и удалите столбец owner из списка выбора для последнего запроса как

select job_name, next_run_date                                  
  from user_scheduler_jobs                                               
 where JOB_NAME = 'JB_EN_LOPES'; 
person Barbaros Özhan    schedule 07.10.2017
comment
с 09:00 до 20:00 каждые 10 мин, забыл, извините - person en Lopes; 07.10.2017
comment
@enLopes я снова отредактировал, удалив часть bysetpos=-1 (я видел, что это не подходит для минутного интервала) и изменил job_type на STORED_PROCEDURE - person Barbaros Özhan; 10.10.2017
comment
тот же результат :-( - person en Lopes; 10.10.2017
comment
@enLopes я добавил свои результаты. - person Barbaros Özhan; 10.10.2017
comment
@enLopes и удаленная часть exclude=Company_Holidays. - person Barbaros Özhan; 10.10.2017
comment
Вы не должны использовать строки (например, 09-oct-2017 09:00:00 am) для значений TIMESTAMP. Используйте литералы функций TO_TIMESTAMP или TIMESTAMP. Для такого интервала вы должны учитывать летнее время. Если вы не укажете часовой пояс в start_date, Oracle будет учитывать часовой пояс текущего сеанса. Это может быть хорошо или нет. Если ваш SESSIONTIMEZONE, например, +02:00, то выполнение задания может быть сдвинуто на один час в зимний сезон. ="nofollow noreferrer">Интервалы повтора и переход на летнее время - person Wernfried Domscheit; 26.09.2019

Я не думаю, что это возможно:

Вот несколько примеров repeat_interval, демонстрирующих универсальность и гибкость синтаксиса календаря:

Запуск в 22:00 ежедневно с понедельника по пятницу:

FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=22; BYMINUTE=0; BYSECOND=0;

Выполнять каждый час:

FREQ=HOURLY;INTERVAL=1;

Выполнять каждые 5 минут:

FREQ=MINUTELY;INTERVAL=5;

Выполнять каждую пятницу в 9:00 (все три примера эквивалентны):

FREQ=DAILY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=WEEKLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=YEARLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;

Каждую вторую пятницу запускайте:

FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;

Выполнять ежегодно в понедельник 5, 10 и 15 недель:

FREQ=YEARLY; BYWEEKNO=5,10,15; BYDAY=MON

Выполняется в последний день каждого месяца.

FREQ=MONTHLY; BYMONTHDAY=-1;

Выполнять в предпоследний день каждого месяца:

FREQ=MONTHLY; BYMONTHDAY=-2;

Выполнить 10 марта (оба примера эквивалентны):

FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;
FREQ=YEARLY; BYDATE=0310;

Выполнять каждые 10, 11, 12, 13 и 14 января (оба примера эквивалентны):

FREQ=YEARLY; BYDATE=0110,0111,0112,0113,0114
FREQ=YEARLY; BYDATE=0110+SPAN:5D;

Запускать каждые 10 дней:

FREQ=DAILY; INTERVAL=10;

Запускайте ежедневно в 16:15, 17:15 и 18:15:

FREQ=DAILY; BYHOUR=16,17,18; BYMINUTE=15; BYSECOND=0;

Выполнять 15-го числа каждого второго месяца:

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=15;

Выполнять 29-го числа каждого месяца:

FREQ=MONTHLY; BYMONTHDAY=29;

Выполнять во вторую среду каждого месяца:

FREQ=MONTHLY; BYDAY=2WED;

Выполнить в последнюю пятницу года:

FREQ=YEARLY; BYDAY=-1FRI;

Запускать каждые 50 часов:

FREQ=HOURLY; INTERVAL=50;

Выполнять в последний день каждого второго месяца:

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=-1;

Выполнять ежечасно в течение первых трех дней каждого месяца:

FREQ=HOURLY; BYMONTHDAY=1,2,3;

Выполнять в 60, 120 и 180 дни года:

FREQ=YEARLY; BYYEARDAY=60,120,180;

Выполнять в последний рабочий день каждого месяца (при условии, что рабочие дни с понедельника по пятницу):

FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=-1

Вот несколько более сложных примеров, которые ссылаются на следующие именованные расписания:

BEGIN
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'COMPANY_HOLIDAYS',
      repeat_interval => 'FREQ=YEARLY; BYDATE=0704,0905,1124,1125,1225;');
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'JUL4',
      repeat_interval => 'FREQ=YEARLY; BYMONTH=JUL; BYMONTHDAY=4;');
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'MEM',
      repeat_interval => 'FREQ=YEARLY; BYMONTH=MAY; BYMONTHDAY=30;');
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'LAB',
      repeat_interval => 'FREQ=YEARLY; BYMONTH=SEP; BYMONTHDAY=5;');
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'LAST_SAT',
      repeat_interval => 'FREQ=MONTHLY; BYDAY=SAT; BYSETPOS=-1;');
   sys.DBMS_SCHEDULER.create_schedule (
      schedule_name => 'END_QTR',
      repeat_interval => 'FREQ=YEARLY; BYDATE=0331,0630,0930,1231;');
   sys.DBMS_SCHEDULER.create_schedule (
    schedule_name => 'FISCAL_YEAR',
    repeat_interval => 'FREQ=YEARLY;BYDATE=0301,0601,0901,1201;PERIODS=4;');
END;
/

Выполняется в последний рабочий день каждого месяца, кроме корпоративных праздников: FREQ=MONTHLY; ДНЕМ=ПН,ВТ,СР,ЧТ,ПТ; EXCLUDE=COMPANY_HOLIDAYS; БАЙСЕТПОС=-1

Выполняется в полдень каждую пятницу и в праздничные дни компании: FREQ=YEARLY; ПО ДНЯМ = ПТ; ПО ЧАСАМ = 12; ВКЛЮЧИТЬ=COMPANY_HOLIDAYS

Бегайте в эти три праздника: 4 июля, День памяти и День труда: 4 июля, MEM, LAB.

Выполнять в последний день месяца, то есть в субботу или в последний день квартала:

FREQ=MONTHLY; BYMONTHDAY=-1; INTERSECT=LAST_SAT,END_QTR

Выполнять в последнюю среду каждого квартала финансового года:

FREQ=FISCAL_YEAR;BYDAY=-1WED

Запуск в последний рабочий день 2-го и 4-го кварталов финансового года (при условии, что рабочие дни с понедельника по пятницу):

FREQ=FISCAL_YEAR;BYDAY=MON,TUE,WED,THU,FRI;BYPERIOD=2,4;BYSETPOS=-1
person Nunyet de Can Calçada    schedule 09.10.2017