创建Oracle Scheduler作业时遇ORA-27419错误:无法确定有效执行日期
ORA-27419错误排查与解决
错误原因
你遇到的ORA-27419错误核心原因很明确:你创建调度schedule_meter_reading后,立刻执行了删除操作,导致后续创建作业Add_reading时,引用的调度对象已经不存在。Oracle Scheduler无法找到有效的调度定义来计算执行日期,因此抛出该错误。
另外补充一个潜在问题:你设置作业的start_date为systimestamp(当前系统时间),而原调度的时间范围是2023-10-31 20:00至21:00,如果当前时间不在这个区间内,即使调度存在,也会因无法找到合法的未来执行时间而触发同类错误,但你当前的首要问题是调度已被删除。
解决方法
方法1:移除不必要的调度删除代码
直接删除这段删除调度的PL/SQL块:
BEGIN DBMS_SCHEDULER.drop_schedule (schedule_name => 'schedule_meter_reading'); END; /
然后按以下顺序执行代码:
- 设置会话日期格式
- 创建调度
- 创建程序
- 创建作业
方法2:调整代码顺序(需先删除旧调度时)
如果是测试场景需要先清理旧调度,必须确保在创建作业前重新创建调度,建议添加异常处理避免因调度不存在而报错。调整后的完整代码如下:
alter session set nls_date_format = 'DD/mon/YYYY HH24:MI:SS'; -- 删除旧调度(添加异常处理,避免调度不存在时报错) BEGIN DBMS_SCHEDULER.drop_schedule (schedule_name => 'schedule_meter_reading'); EXCEPTION WHEN OTHERS THEN IF SQLCODE != -27407 THEN -- 捕获"调度不存在"的错误码 RAISE; END IF; END; / -- 重新创建调度 BEGIN dbms_scheduler.create_schedule ( schedule_name => 'schedule_meter_reading', start_date => '31-OCT-2023 20:00:00', repeat_interval => 'FREQ=MINUTELY; INTERVAL=5', end_date => '31-OCT-2023 21:00:00', comments => 'repeated every 5 minutes' ); END; / -- 创建程序 BEGIN dbms_scheduler.create_program(program_name => 'add_meter_reading', program_type => 'PLSQL_BLOCK', program_action => 'BEGIN show_time; END;' , enabled => true, comments => 'Reading data from the meter'); END; / -- 创建作业 BEGIN dbms_scheduler.create_job(job_name => 'Add_reading', program_name => 'add_meter_reading', start_date => systimestamp, repeat_interval => 'schedule_meter_reading', enabled => true); END; /
额外注意事项
- 确保
show_time存储过程已存在,否则作业执行时会触发"标识符无效"的错误。 - 如果当前系统时间已经超过调度的
end_date(2023-10-31 21:00),即使调度存在,作业也会因无法找到未来执行时间而报错,此时需要修改调度的start_date和end_date为当前时间之后的有效范围。
内容的提问来源于stack exchange,提问作者Pitt Bear
相关产品推荐
相关产品推荐

