Не удается снова запустить завершенное задание Oracle

Невозможно запустить завершенное задание DBMS_SCHEDULER, удалив END_DATE

Всем привет! Я использую oracle 12cR1, теперь у меня проблема с DBMS_SCHEDULER заданиями.

Во-первых, я создал повторяющиеся задания оракула 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, или это ошибка оракула?

Заранее спасибо и с наилучшими пожеланиями!


person frog2861    schedule 05.05.2019    source источник
comment
Просто угадай: DBMS_SCHEDULER.set_attribute_null (name=>'JOB_3358', attribute=>'end_date')   -  person Lukasz Szozda    schedule 11.05.2019
comment
Пробовал, не получилось, работа остановилась. Все равно спасибо!   -  person frog2861    schedule 17.05.2019
comment
Может быть, эта ссылка может помочь вам определить вашу цель-   -  person Legion    schedule 17.05.2019


Ответы (1)


хитрый. Я воспроизвел вашу проблему. Затем я попытался изменить start_date на systimestamp при удалении end_date, что снова не сработало. Но затем я изменил start_date на systimestamp плюс немного при удалении end_date, и тогда это сработало. Рабочий пример ниже. Кажется, что некоторая информация о задании где-то кэшируется/хранится, и мы можем удалить эту информацию, установив start_date немного в будущее, чтобы логика планирования срабатывала при включении задания (моя дикая теория о том, что происходит). Рабочий пример удаления end_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');
person Peter    schedule 17.05.2019
comment
Вау, отличная работа. Это безумие, что вам нужно запустить команду, которая вызывает исключение, чтобы запустить задание. - person Jon Heller; 18.05.2019
comment
Спасибо. Кажется, задание кэшировано/сохранено, потому что на следующий день я снова включил задание (когда end_date имеет значение null), оно начинает работать и больше не останавливается. Поскольку задание было создано через Windows Form (без использования клиента оракула напрямую), при нажатии кнопки «Сохранить» в форме я отправляю две команды, чтобы установить end_date, первая устанавливает end_date на 2999/12/31, затем второй установил для end_date значение null, поэтому задание остановится на 2999/12/31. - person frog2861; 21.05.2019