【发布时间】:2017-10-14 08:17:18
【问题描述】:
我试图在每个工作日(周一到周六)早上 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: 进行请求更改后无法重新启用“[schema]”。“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。
【问题讨论】: