Задание планировщика Oracle не запускается: ошибка неподходящей даты

Я пытаюсь создать задание планировщика в Oracle. Задание создается и появляется в списке заданий, но его не удается запустить в запланированное время, а вместо этого выдает ошибку. Например, сейчас выдает ошибку: «04 июля 24» не является подходящей датой. Как я могу решить эту проблему?

CREATE OR REPLACE PROCEDURE RPPR_DAILY_REP_CALL AS
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'DAILY_BATCH',
                            JOB_TYPE        => 'PLSQL_BLOCK',
                            JOB_ACTION      => 'BEGIN RPPR_DAILY_REP_BATCH;END;',
                            START_DATE      => SYSTIMESTAMP,
                            REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=8; BYMINUTE=0; BYSECOND=0',
                            ENABLED         => TRUE,
                            AUTO_DROP       => FALSE,
                            COMMENTS        => 'JOB TO RUN PROCEDURE AT 8AM');

  DBMS_SCHEDULER.RUN_JOB(JOB_NAME => 'DAILY_BATCH');
END;

ОШИБКА:

ORA-23319: parameter value "04-JUL-24" is not appropriate
ORA-06512: at "SYS.DBMS_JOB", line 84
ORA-06512: at "SYS.DBMS_JOB", line 163
ORA-06512: at "REGREP.RPPR_DAILY_REP_BATCH", line 8
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_ISCHED", line 209
ORA-06512: at "SYS.DBMS_SCHEDULER", line 594
ORA-06512: at "REGREP.RPPR_DAILY_REP_CALL", line 12
ORA-06512: at line 3

ПОКА Я БЕГУ

BEGIN
DBMS_SCHEDULER.DROP_JOB('DAILY_BATCH');--ONLY WHEN JOB ALREADY EXISTS
RPPR_DAILY_REP_CALL;
END;

🤔 А знаете ли вы, что...
Oracle Database 19c - это последняя версия базы данных Oracle на момент завершения моего обучения в сентябре 2021 года.


3
53
2

Ответы:

Вы уверены, что проблема связана с dbms_scheduler? Я создал вашу процедуру и задание в своей собственной среде, изменив только значение job_action, и при его запуске не возникло никаких ошибок.

Вот процедура:

И это результат запуска процедуры с:

BEGIN 
 DBMS_SCHEDULER.DROP_JOB('DAILY_BATCH');--ONLY WHEN JOB ALREADY EXISTS
 RPPR_DAILY_REP_CALL;
END;

А вот как задание указано в user_scheduler_jobs:

Я предполагаю проверить процедуру RPPR_DAILY_REP_BATCH, возможно там что-то происходит.


Решено

Я обнаружил проблему: процедура RPPR_DAILY_REP_BATCH отправляла задания с использованием SYSDATE при запуске. Проблема возникла из-за того, что SYSDATE неправильно объединялся в разделе WHAT файла DBMS_JOB.SUBMIT внутри тела RPPR_DAILY_REP_BATCH. Правильный подход — обеспечить, чтобы SYSDATE рассматривалась как строка для объединения.

Изначально я использовал:

dbms_job.submit(
    job => v_job,
    what => 'begin prc_submit_job(' || sysdate || '); end;'
);

Это вызвало ошибку из-за прямого включения SYSDATE. Чтобы это исправить, я преобразовал SYSDATE в строку с помощью TO_CHAR и обернул ее TO_DATE в разделе WHAT. Исправленный код:

dbms_job.submit(
    job => v_job,
    what => 'begin prc_submit_job(to_date(''' || to_char(sysdate, 'DD-MON-YYYY') || ''', ''DD-MON-YYYY'')); end;'
);

Это гарантирует, что SYSDATE правильно отформатирован и объединен в строку, что позволяет избежать предыдущей ошибки.