有没有办法让 Oracle 作业自行禁用?
Is there a way to make an Oracle Job disable itself?
我正在努力做到这一点:
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
当计数器returns 为零时,它会禁用这个作业。但是,我得到:
"ORA-27478: o job "SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND" está em execução"
最后一位表示"it's executing"。
所以,我认为这是因为作业正在运行并且无法自行关闭。
我认为另一种方法可能是更改结束日期,但我似乎找不到执行此操作的语法。
有人可以帮忙吗?这可以实现吗?
我想你可以做两件事,
- 强制停止作业然后禁用它。
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
- 检查作业是否完成,然后禁用。
SELECT status FROM USER_SCHEDULER_JOB_LOG
WHERE job_name = 'JOB_ATUALIZAR_VAL_MAT_PEND' and operation = 'RUN' ORDER BY log_date desc
offset 0 rows fetch next 1 row only; -- This will give you the latest run's status
将其存储到一个变量中(比如 status_),然后像下面这样检查,
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 and status_ ="Succeeded" then
DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
感谢@Shankar 的帮助。这就是我设法完成我想要做的事情的方式:
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
dbms_scheduler.set_attribute('JOB_ATUALIZAR_VAL_MAT_PEND', 'end_date', systimestamp + 1);
end if;
end;
我已经想到了这一点,但是当智能感知弹出说 "value" 参数是 "boolean" 时,我什至没有尝试将日期传递给它。现在它工作正常,但我认为我必须添加一个:
如果您尝试将结束日期设置为提前一小时或几分钟,这将不起作用。您需要实际更改日期,否则它会给您 ORA-27483:"string.string" 有一个无效的 END_DATE。
我正在努力做到这一点:
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
当计数器returns 为零时,它会禁用这个作业。但是,我得到:
"ORA-27478: o job "SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND" está em execução"
最后一位表示"it's executing"。
所以,我认为这是因为作业正在运行并且无法自行关闭。
我认为另一种方法可能是更改结束日期,但我似乎找不到执行此操作的语法。
有人可以帮忙吗?这可以实现吗?
我想你可以做两件事,
- 强制停止作业然后禁用它。
declare Contador number; begin ATUALIZAR_VAL_MAT_PENDENTES(Contador); if Contador = 0 then DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true); dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND'); end if; end;
- 检查作业是否完成,然后禁用。
SELECT status FROM USER_SCHEDULER_JOB_LOG WHERE job_name = 'JOB_ATUALIZAR_VAL_MAT_PEND' and operation = 'RUN' ORDER BY log_date desc offset 0 rows fetch next 1 row only; -- This will give you the latest run's status
将其存储到一个变量中(比如 status_),然后像下面这样检查,
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 and status_ ="Succeeded" then
DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
感谢@Shankar 的帮助。这就是我设法完成我想要做的事情的方式:
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
dbms_scheduler.set_attribute('JOB_ATUALIZAR_VAL_MAT_PEND', 'end_date', systimestamp + 1);
end if;
end;
我已经想到了这一点,但是当智能感知弹出说 "value" 参数是 "boolean" 时,我什至没有尝试将日期传递给它。现在它工作正常,但我认为我必须添加一个:
如果您尝试将结束日期设置为提前一小时或几分钟,这将不起作用。您需要实际更改日期,否则它会给您 ORA-27483:"string.string" 有一个无效的 END_DATE。