我有一个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 .