Есть ли способ отключить работу 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.

Я думаю, вы могли бы сделать две вещи,

  1. Принудительно остановите работу, а затем отключите ее.
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;
  1. Проверьте выполнение задания и затем отключите.
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;
Другие вопросы по тегам