You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-27367错误排查:DBMS Scheduler作业关联程序被禁用但未手动禁用的原因分析

解决ORA-27367: program关联作业被禁用的问题

这个错误的核心很明确:你创建的PROG_SIXMONTHPRIORITY程序对象处于禁用状态,不是作业本身的问题——Oracle DBMS Scheduler的作业是通过关联的program来执行任务的,哪怕作业本身是启用的,只要关联的program被禁用,作业就会执行失败。

为什么会出现这个情况?

默认情况下,使用DBMS_SCHEDULER.CREATE_PROGRAM创建程序对象时,它的初始状态是DISABLED(禁用),哪怕你关联的存储过程本身可以正常执行,这个program对象还是需要手动启用才能被作业调用。

排查与解决步骤:

  1. 先确认程序的状态
    执行这条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被禁用的问题。

  1. 启用程序对象
    执行以下PL/SQL代码启用program:
BEGIN
  DBMS_SCHEDULER.ENABLE('PROG_SIXMONTHPRIORITY');
END;
/

执行完成后,再重新触发作业或者等待下一次调度执行,应该就能正常运行了。

  1. 避免后续再踩这个坑
    如果你不想每次创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:07:31