gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:32:51 25 4
gpt4 key购买 nike

无法通过删除DBMS_SCHEDULER运行已完成的END_DATE作业

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

首先,我通过设置DBMS_SCHEDULER创建了一个重复的oracle 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为空。
但是Job仅再次运行一次,然后停止运行,的运行日志为 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的错误?

在此先感谢您,并致以最诚挚的问候!

最佳答案

棘手的一个。我转载了您的问题。然后,我尝试在删除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');

关于oracle - 无法再次运行已完成的Oracle作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com