Я пытаюсь создать задание планировщика в 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 года.
Вы уверены, что проблема связана с 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 правильно отформатирован и объединен в строку, что позволяет избежать предыдущей ошибки.