周末 Oracle DBMS 调度器频率变化
Oracle DBMS Scheduler change in frequency on weekends
我创建了一个 oracle dbms 调度程序,每天早上 5 点、上午 10 点、下午 3 点和晚上 8 点执行一个过程。下面是调度程序代码
DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'TEST_JOB'
,start_date => SYSDATE
,repeat_interval => 'FREQ=DAILY; BYHOUR=05,10,15,20; BYMINUTE=00 ;BYSECOND=0;'
,end_date => NULL
,job_class => 'DEFAULT_JOB_CLASS'
,job_type => 'PLSQL_BLOCK'
,enabled => TRUE
,job_action => 'BEGIN INSERT_IN_TABLE; END;'
,comments => 'TEST JOB'
);
现在我必须修改同一个调度程序,以便在周末仅执行两次相同的过程,并且 运行 在工作日以相同的频率执行。
我不想为周末执行创建不同的调度程序,因为有时程序需要超过 5 个小时才能执行。
如果有更好的实现方法,请指导我。
一种选择是使用嵌入式日历,这样您就可以创建自己的日历表达式。
举个例子
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_CALC 时间表,这是两种不同频率的组合。
当然,您始终可以创建两个作业,但在 11g 中没有创建不兼容性的选项,这是 DBMS_SCHEDULER 12c 之后的一个对象,它会阻止一个作业在另一个作业完成之前启动。
我的建议是,使用嵌入多个频率的日程表
我创建了一个 oracle dbms 调度程序,每天早上 5 点、上午 10 点、下午 3 点和晚上 8 点执行一个过程。下面是调度程序代码
DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'TEST_JOB'
,start_date => SYSDATE
,repeat_interval => 'FREQ=DAILY; BYHOUR=05,10,15,20; BYMINUTE=00 ;BYSECOND=0;'
,end_date => NULL
,job_class => 'DEFAULT_JOB_CLASS'
,job_type => 'PLSQL_BLOCK'
,enabled => TRUE
,job_action => 'BEGIN INSERT_IN_TABLE; END;'
,comments => 'TEST JOB'
);
现在我必须修改同一个调度程序,以便在周末仅执行两次相同的过程,并且 运行 在工作日以相同的频率执行。
我不想为周末执行创建不同的调度程序,因为有时程序需要超过 5 个小时才能执行。
如果有更好的实现方法,请指导我。
一种选择是使用嵌入式日历,这样您就可以创建自己的日历表达式。
举个例子
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_CALC 时间表,这是两种不同频率的组合。
当然,您始终可以创建两个作业,但在 11g 中没有创建不兼容性的选项,这是 DBMS_SCHEDULER 12c 之后的一个对象,它会阻止一个作业在另一个作业完成之前启动。
我的建议是,使用嵌入多个频率的日程表