我有一个Oracle DBMS_SCHEDULER作业,通常每小时运行一次。没问题。但是,我最近需要对此做一个例外,因此每周六的最后一次运行(即晚上11点的运行)会提前一点。 (理性是一个涉及公司政治的长篇故事。)
我以为我可以使用EXCLUDE子句轻松完成这项工作,但我无法解决这个问题。我得到的错误如下:
ORA-27422: usage of BYHOUR not supported in embedded calendar application...
ORA-06512: at "SYS.DBMS_ISCHED", line 135
ORA-06512: at "SYS.DBMS_SCHEDULER", line 271
ORA-06512: at "XDH.ROBOT", line 680
ORA-06512: at line 1
我发现让它发挥作用的唯一方法是创建三个(!)时间表,如下所示:
dbms_scheduler.create_schedule(
schedule_name => 'sunday_to_friday',
repeat_interval => 'freq = hourly; interval = 1; byday=sun,mon,tue,wed,thu,fri' );
dbms_scheduler.create_schedule( --All but the last run on Saturday.
schedule_name => 'saturday_most',
repeat_interval =>
'freq = hourly; byday=sat;'||
' byhour=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22' );
dbms_scheduler.create_schedule( --Last run on Saturday.
schedule_name => 'saturday_last',
repeat_interval =>
'freq = weekly; byday=sat; byhour=22; byminute=54 ' );
然后我使用了&sunday_to_friday,saturday_most,saturday_last'作为作业本身的repeat_interval。
这看起来很笨拙。是否有更好/更简单的方法来做这种事情?
我们目前正在使用Oracle 11g版本11.2.0.4.0。