无法通过删除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的错误?
在此先感谢您,并致以问候!
答案 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');