【问题标题】:Oracle dbms_scheduler error with BYTIMEBYTIME 的 Oracle dbms_scheduler 错误
【发布时间】: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。

【问题讨论】:

    标签: oracle12c dbms-scheduler


    【解决方案1】:

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

    我发现以下工作使用 BYMinute 和 ByHour

    DBMS_SCHEDULER.set_attribute( name => '"TEST"."JOB"', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=9;BYMINUTE=30;BYDAY=MON,TUE,WED ,周四,周五,周六,周日');

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 2020-05-28
      • 1970-01-01
      • 2015-12-02
      • 2018-02-17
      • 2020-08-01
      • 2014-11-24
      • 2021-01-21
      • 2018-02-19
      相关资源
      最近更新 更多