Есть ли способ отключить работу Oracle Job?
Я пытаюсь сделать это
declare
Contador number;
begin
ATUALIZAR_VAL_MAT_PENDENTES(Contador);
if Contador = 0 then
dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
end if;
end;
Когда счетчик вернет ноль, он отключит этот самый JOB. Но я получаю:
"ORA-27478: o задание"SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND"есть исполнение"
Этот последний бит означает "он исполняется".
Итак, я думаю, что это потому, что работа выполняется, и она не может закрыться сама.
Я думаю, что другим подходом может быть изменение даты окончания, но я не могу найти синтаксис для этого.
Кто-нибудь может помочь? Это достижимо?
2 ответа
Спасибо @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;
Я уже думал об этом, но когда всплыла информация о том, что параметр "значение" является "логическим", я даже не попытался передать ему дату. Сейчас все работает нормально, но есть одна мысль, которую я должен добавить:
Это не работает, если вы пытаетесь установить конечную дату на час или минуты раньше времени. Вам действительно нужно изменить день, или это даст вам ORA-27483: "string.string" имеет недопустимый END_DATE.
Я думаю, вы могли бы сделать две вещи,
- Принудительно остановите работу, а затем отключите ее.
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;