использование параметра исключения в планировщике Oracle для еженедельного расписания

Мы настроили наш планировщик для еженедельного запуска в каждый понедельник, но в качестве требования мы хотели бы пропустить этот планировщик на определенную дату месяца. например, я не хочу запускать это на 15 мая 2015 г., 16 июня 2015 г. и т. д.

BEGIN
DBMS_SCHEDULER.set_attribute( name => '"SCHEMA"."NAME"', attribute => 'repeat_interval', value => 'FREQ=WEEKLY;BYDAY=MON;BYHOUR=13;BYMINUTE=0;BYSECOND=0');
END; 
/

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

Может кто-нибудь, пожалуйста, помогите.


person kumarb    schedule 08.05.2015    source источник
comment
Для оценки вы также можете использовать эту процедуру: DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING   -  person Wernfried Domscheit    schedule 08.05.2015


Ответы (1)


вы должны сначала определить другое расписание для исключенных дней. Если между ними нет реального повторяющегося шаблона, вы должны определить расписание для каждого исключенного дня. Что-то вроде этого:

BEGIN

    -- define a schedule for May 15th
    DBMS_SCHEDULER.CREATE_SCHEDULE (
        repeat_interval  => 'FREQ=YEARLY;BYDATE=0515',     
        comments         => 'Exclude May 15th',
        schedule_name    => '"May15th"'
    ); 

    -- define a schedule for June 16th
    DBMS_SCHEDULER.CREATE_SCHEDULE (
        repeat_interval  => 'FREQ=YEARLY;BYDATE=0616',     
        comments         => 'Exclude June 16th',
        schedule_name    => '"June16th"'
    );

    -- note the EXCLUDE in the value parameter
    DBMS_SCHEDULER.set_attribute( 
        name => '"SCHEMA"."NAME"', 
        attribute => 'repeat_interval', 
        value => 'FREQ=WEEKLY;BYDAY=MON;BYHOUR=13;BYMINUTE=0;BYSECOND=0;EXCLUDE=May15th,Jun16th;'
    );
END;
person xionutz2k    schedule 08.05.2015
comment
Спасибо за помощь. Можем ли мы включить все эти исключенные даты в одно расписание. В моем случае у нас есть 15 таких дат, и нам не нужно иметь для этого 15 планировщиков. Посоветуйте, пожалуйста. - person kumarb; 08.05.2015
comment
если между 15 днями есть какие-либо повторяющиеся отношения (например, они происходят каждые 30 дней или каждую первую субботу месяца), вы можете определить единый график для всех из них, указав соответствующий интервал повторения. Если даты случайные, то нужно определить 15 расписаний :( К сожалению, проще некуда. - person xionutz2k; 08.05.2015
comment
Единственная альтернатива, о которой я могу думать, - это перенести эту логику в процесс, который выполняется планировщиком. Например, если планировщик выполняет процедуру, вы можете проверить внутри этой процедуры, находится ли sysdate в списке предопределенных дат (вы можете сохранить их в таблице поиска) и выполнить остальную часть пакета, только если sysdate не входит в число предопределенных дат. исключенные. - person xionutz2k; 08.05.2015
comment
Это не работает для меня. Продолжайте выдавать эту ошибку. - person kumarb; 08.05.2015
comment
Если вы используете SOA_SOAINFRA.MAY15TH, убедитесь, что вы также определили расписание на 15 мая в верхнем регистре. - person xionutz2k; 08.05.2015
comment
Вы можете комбинировать расписания следующим образом: DBMS_SCHEDULER.CREATE_SCHEDULE('ScheduleExcludes', repeat_interval => 'FREQ=YEARLY;INTERSECT=May15th,Jun16th'); - person Wernfried Domscheit; 08.05.2015
comment
Все. Я попытался настроить один планировщик, например FREQ=YEARLY;BYDATE=0508,0509,0510,0511,0513, и использовал его как часть задания БД. Он работает нормально. Поэтому я не думаю, что нам нужно создавать другой планировщик для разных дат. в одном планировщике мы можем указать все даты и использовать его. - person kumarb; 12.05.2015