我试图在每个工作日(周一至周六)上午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');
希望这对某人有帮助。