我试图在每个工作日(周一至周六)上午6:30运行一份工作,Oracle调度程序拒绝了


ORA-27419“无法从重复中确定有效执行日期
间隔”


当我发现以下行为时,我开始失去理智:

首先,创建一个虚拟作业。请注意,它没有时间表,也没有启用。

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"TMP_DUMMY"',
            job_type => 'PLSQL_BLOCK',
            job_action => 'begin
                              dbms_lock.sleep(5);
                           end;',
            number_of_arguments => 0,
            start_date => NULL,
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => 'Test Job');




    DBMS_SCHEDULER.SET_ATTRIBUTE(
             name => '"TMP_DUMMY"', attribute => 'store_output', value => TRUE);
    DBMS_SCHEDULER.SET_ATTRIBUTE( name => '"TMP_DUMMY"',    attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);

END;
/


下一步,使用BYTIME设置一个repeat_interval,其执行时间等于或小于整小时后的02:55(MI:SS)。不论是否有“小时”部分都可以完成操作,对于前一种选择,确切的小时也没有关系。

BEGIN
   DBMS_SCHEDULER.set_attribute( name => '"TMP_DUMMY"', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYTIME=010255');
   DBMS_SCHEDULER.enable(name=>'"TMP_DUMMY"');
END;
/


这对我来说很好用。

现在我想将BYTIME增加1秒到02:56(MI:SS)

BEGIN
   DBMS_SCHEDULER.set_attribute( name => '"TMP_DUMMY"', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYTIME=010256');
END;
/


运行此属性更改我得到


ORA-27470:进行请求的更改后,无法重新启用“ [模式]”。“ TMP_DUMMY”
ORA-27419:无法从重复间隔确定有效的执行日期


我已经针对所有MI:SS组合验证了此行为:

set serveroutput on
DECLARE
  l_rep_interval VARCHAR2(50 CHAR);
BEGIN
FOR mi IN 0..59
LOOP
  FOR ss IN 0..59
  LOOP
    l_rep_interval := 'FREQ=DAILY;BYTIME='||lpad(to_char(mi*100+ss),4,'0');
    DBMS_SCHEDULER.set_attribute( name => '"TMP_DUMMY"', attribute => 'repeat_interval', value => l_rep_interval);
    DBMS_SCHEDULER.enable(name=>'"TMP_DUMMY"');
    DBMS_OUTPUT.PUT_LINE(l_rep_interval);
  END LOOP; --end ss
END LOOP; --end mi

EXCEPTION WHEN OTHERS THEN NULL;

END;
/


它从00:00到02:55正常工作,并且在所有其他时间都失败。
对我来说,这似乎将MI:SS部分视为tinyint,并且更高的值会导致类型溢出。

这是调度程序中的错误,还是我在这里错过了一些东西?
Oracle版本是12c。

最佳答案

我只是遇到了同样的问题。 (从文档中)看起来BYTIME无法识别(即使您查看作业GUI的“ SQL”选项卡,即使SQLDeveloper也会使用它)

我发现以下使用BYMinute和ByHour的作品

DBMS_SCHEDULER.set_attribute(name =>'“ TEST”。“ JOB”',属性=>'repeat_interval',值=>'FREQ = DAILY; BYHOUR = 9; BYMINUTE = 30; BYDAY = MON,TUE,WED,THU, FRI,SAT,SUN');

希望这对某人有帮助。

07-28 14:01