Одним из вариантов может быть использование встроенных календарей, чтобы вы могли создать собственное календарное выражение.
Позвольте мне показать вам пример
SQL> BEGIN
dbms_scheduler.create_schedule('my_schedule_c_1', repeat_interval =>
'FREQ=DAILY; BYHOUR=05,10,15,20; BYMINUTE=00; BYSECOND=00; ');
dbms_scheduler.create_schedule('my_schedule_c_2', repeat_interval =>
'FREQ=DAILY; BYDAY=SAT,SUN; BYHOUR=05,10; BYMINUTE=00; BYSECOND=00;');
END;
/ 2 3 4 5 6 7
PL/SQL procedure successfully completed.
SQL> begin
DBMS_SCHEDULER.create_schedule ('MY_CALC', repeat_interval =>'my_schedule_c_1, my_schedule_c_2');
END;
/ 2 3 4
PL/SQL procedure successfully completed.
SQL>
Затем вам нужно только применить это расписание для вашего задания
SQL> begin
2 DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'TEST_JOB'
,start_date => SYSDATE
3 ,repeat_interval => 'MY_CALC'
4 ,end_date => NULL
,job_class => 'DEFAULT_JOB_CLASS'
,job_type => 'PLSQL_BLOCK'
5 6 7 8 9 10 ,enabled => TRUE
,job_action => 'BEGIN NULL; END;'
,comments => 'TEST JOB'
); 11 12 13
14 end;
15 /
PL/SQL procedure successfully completed.
SQL>
Таким образом, мое задание будет выполняться с использованием расписания MAIN_CAL C, которое представляет собой комбинацию двух разных частот.
Конечно, вы можете всегда создавайте два задания, но в 11g нет возможности создавать несовместимости, что является объектом в DBMS_SCHEDULER 12 c и далее, который не позволяет запускать задание до тех пор, пока другое не будет завершено.
Мой совет, используйте календарь расписания, встроенный с несколькими частотами