无法再次运行已完成的Oracle作业

时间:2019-05-05 08:22:12

标签: oracle oracle12c dbms-scheduler

无法通过删除DBMS_SCHEDULER

来运行完成的END_DATE作业

大家好! 我正在使用oracle 12cR1,现在在DBMS_SCHEDULER作业中遇到问题。

首先,我创建了一个重复的oracle DBMS_SCHEDULER作业,其中设置了END_DATE, 在设置END_DATE之后,作业成功完成,并且作业的启用状态自动更改为禁用。 根据作业的运行日志,“操作”为COMPLETED,而“其他信息”为REASON="End time reached" 那是意料之中的。

然后,我想再次运行作业,我通过

删除了END_DATE字段
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE('JOB_XXX', 'END_DATE', '');

并通过

设置作业启用
SYS.DBMS_SCHEDULER.ENABLE(name => 'JOB_XXX');

我可以看到该作业已再次启用,并且END_DATE为空。 但是作业再次运行一次,然后停止,其运行日志为COMPLETED,而其他信息再次为REASON="End time reached"

BEGIN
     sys.dbms_scheduler.CREATE_JOB(
     JOB_NAME            => 'JOB_3358',
     job_type            => 'STORED_PROCEDURE',
     JOB_ACTION          => 'TEST_JOB',
     START_DATE          => to_date('2019-05-05 13:35:00','yyyy-mm-dd hh24:mi:ss'),
     REPEAT_INTERVAL     => 'FREQ= SECONDLY;INTERVAL=30',
     END_DATE            => to_date('2019-05-05 13:38:00','yyyy-mm-dd hh24:mi:ss'),
     auto_drop           => FALSE,
     COMMENTS            => NULL);
    END;
/


begin
  sys.dbms_scheduler.enable(name => 'JOB_3358');
end;
/

我期望该作业将再次根据REPEAT_INTERVAL运行, 并且end_date为空,因此永远都不应停止。

删除END_DATE时是否有任何错误,还是这是oracle的错误?

在此先感谢您,并致以问候!

1 个答案:

答案 0 :(得分:2)

棘手的一个。我转载了您的问题。然后,我尝试在删除end_date时将start_date更改为systimestamp,但再次无法使用。但是,然后我在删除end_date时将start_date更改为systimestamp,并进行了一些修改,然后它开始工作。下面的工作示例。似乎有关该作业的某些信息已缓存/存储在某个地方,我们可以通过在将来的将来稍微设置start_date来删除此信息,以便在启用该作业时触发调度逻辑(我对发生的事情的狂热理论)。删除已完成工作的结束日期的工作示例:

BEGIN
     sys.dbms_scheduler.CREATE_JOB(
     JOB_NAME            => 'MYUSER.JOB_3358',
     job_type            => 'PLSQL_BLOCK',
     JOB_ACTION          => 'begin null; end;',
     START_DATE          => systimestamp,
     REPEAT_INTERVAL     => 'FREQ= SECONDLY;INTERVAL=30',
     END_DATE            => systimestamp + interval '2' minute,
     auto_drop           => FALSE,
     COMMENTS            => NULL);
    END;
/

begin
  sys.dbms_scheduler.enable(name => 'MYUSER.JOB_3358');
end;
/

-- wait until job shows as completed

exec DBMS_SCHEDULER.set_attribute_null (name=>'MYUSER.JOB_3358', attribute=>'end_date');

begin
          dbms_scheduler.set_attribute (
            name      => 'MYUSER.JOB_3358',
            attribute => 'start_date',
            value     => systimestamp + interval '1' minute);
    end;
    /

begin
  sys.dbms_scheduler.enable(name => 'MYUSER.JOB_3358');
end;
/

-- job will continue to run every 30 seconds indefinitely

--cleanup
exec sys.dbms_scheduler.drop_JOB(     JOB_NAME            => 'MYUSER.JOB_3358');

编辑:以上操作无法可靠地起作用。它有时起作用,但并非总是如此。到目前为止,在我的测试中唯一可靠的方法(傻!!!)是:

exec DBMS_SCHEDULER.set_attribute_null (name=>'MYUSER.JOB_3358', attribute=>'end_date');
-- This line raises "ORA-27469: NEXT_RUN_DATE is not a valid job attribute" but is necessary.
exec DBMS_SCHEDULER.set_attribute_null (name=>'MYUSER.JOB_3358', attribute=>'next_run_date');
exec dbms_scheduler.enable(name => 'MYUSER.JOB_3358');