ORA-27367错误排查:DBMS Scheduler作业关联程序被禁用但未手动禁用的原因分析
解决ORA-27367: program关联作业被禁用的问题
这个错误的核心很明确:你创建的PROG_SIXMONTHPRIORITY程序对象处于禁用状态,不是作业本身的问题——Oracle DBMS Scheduler的作业是通过关联的program来执行任务的,哪怕作业本身是启用的,只要关联的program被禁用,作业就会执行失败。
为什么会出现这个情况?
默认情况下,使用DBMS_SCHEDULER.CREATE_PROGRAM创建程序对象时,它的初始状态是DISABLED(禁用),哪怕你关联的存储过程本身可以正常执行,这个program对象还是需要手动启用才能被作业调用。
排查与解决步骤:
- 先确认程序的状态
执行这条SQL查询来验证PROG_SIXMONTHPRIORITY的启用状态:
-- 如果是当前schema,用user_scheduler_programs;跨schema则用dba_scheduler_programs SELECT program_name, enabled FROM user_scheduler_programs WHERE program_name = 'PROG_SIXMONTHPRIORITY';
如果结果里enabled列显示FALSE,就坐实了是program被禁用的问题。
- 启用程序对象
执行以下PL/SQL代码启用program:
BEGIN DBMS_SCHEDULER.ENABLE('PROG_SIXMONTHPRIORITY'); END; /
执行完成后,再重新触发作业或者等待下一次调度执行,应该就能正常运行了。
- 避免后续再踩这个坑
如果你不想每次创建program都手动启用,可以在CREATE_PROGRAM的时候直接指定enabled => TRUE参数,把创建和启用一步完成:
BEGIN DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'PROG_SIXMONTHPRIORITY', program_action => 'SIXMONTHPRIORITY', program_type => 'STORED_PROCEDURE', enabled => TRUE -- 直接设置为启用状态 ); END; /
额外说明
你单独执行存储过程SIXMONTHPRIORITY正常,是因为你直接调用的是存储过程本身,而作业是通过DBMS Scheduler的program对象间接调用的——这两个是不同的执行路径,所以存储过程的状态不影响program的状态。
内容的提问来源于stack exchange,提问作者Rmd90
相关产品推荐
相关产品推荐

