използване на опцията за изключване в Oracle Scheduler за седмичен график

Конфигурирахме нашия планировчик да работи на седмична база всеки понеделник, но като изискване бихме искали да пропуснем този планировчик за конкретна дата от месеци. сякаш не искам да стартирам това за 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
Не работи за мен. Продължавайте да давате тази грешка. ORA-27412: повтарящ се интервал или календарът съдържа невалиден идентификатор: SOA_SOAINFRA.MAY15TH ORA-06512: в SYS.DBMS_ISCHED, ред 4478 ORA-06512: в SYS.DBMS_SCHEDULER, ред 2862 - 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 и го използвах като част от заданието на DB. Работи добре. Така че не мисля, че трябва да създадем различен планировчик за различни дати. в един планировчик можем да посочим всички дати и да го използваме. - person kumarb; 12.05.2015