必须显式指定job_name、job_type和job_action三要素,缺一不可且顺序固定;job_name需全局唯一并建议加业务前缀;job_type选'STORED_PROCEDURE'或'PLSQL_BLOCK';job_action按类型对应填写过程名或匿名块;repeat_interval须用大写iCalendar语法;START_DATE为首次执行时间而非创建时间,需显式指定时区;带参存储过程须用PLSQL_BLOCK或SET_JOB_ARGUMENT_VALUE;作业启用后需监控状态、日志及失败详情。
直接用 DBMS_SCHEDULER.CREATE_JOB 创建作业就行,但必须写全三要素
oracle 10g 起,dbms_scheduler 是唯一推荐且实际必需的调度工具;dbms_job 在 12c/19c 中已废弃,新项目别碰它。
最简可用作业必须显式指定:job_name、job_type 和 job_action,缺一不可,顺序不能乱:
-
job_name必须在当前 schema 下全局唯一,建议带业务前缀,比如'JOB_LOAD_FACT_DAILY' -
job_type选'STORED_PROCEDURE'(无参)或'PLSQL_BLOCK'(可写 BEGIN/END 块) -
job_action若是STORED_PROCEDURE类型,只填过程名,如'PROC_SYNC_USER'—— 别加括号、参数、分号 -
repeat_interval必须用 iCalendar 语法,FREQ=大写开头,BYHOUR/BYMINUTE等也全大写,漏一个等号或大小写错误就报 ORA-27469
START_DATE 不是“创建时间”,而是首次执行时间
这个值决定作业第一次跑啥时候,不是你执行 CREATE_JOB 的那一刻。设成过去时间,作业会立刻触发一次,再按规则走下一轮。
常见写法:
- 明天凌晨 2 点:
TRUNC(SYSDATE) + 1 + 2/24 - 今天下午 3:15:
TRUNC(SYSDATE) + 15/24 + 15/1440 - 必须显式指定时区,否则依赖数据库默认时区(可能和你的业务预期不一致),推荐写成:
FROM_TZ(CAST(TRUNC(SYSDATE) + 1/24 AS TIMESTAMP), 'Asia/Shanghai')
存储过程带参数?不能直传,得切到 PLSQL_BLOCK 或用 SET_JOB_ARGUMENT_VALUE
STORED_PROCEDURE 类型的 job_action 完全不支持传参。写 'MY_PROC(''20260615'', ''20260616'')' 会直接报 ORA-27469。
两种合规解法:
- 改用
PLSQL_BLOCK:把调用包进匿名块,例如job_action => 'BEGIN MY_PROC(''20260615'', ''20260616''); END;' - 保留
STORED_PROCEDURE类型,先创建 job,再用DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE分别设第 1、2 个参数值 —— 注意参数序号从 1 开始,且必须在 job 未启用前 设置 - 如果参数是动态的(比如每次取前一天日期),
PLSQL_BLOCK更灵活;如果参数固定且想复用同一 job 模板,用SET_JOB_ARGUMENT_VALUE更清晰
作业建完就完事了?还得查状态、看日志、处理失败
启用后不等于跑成功。作业可能因权限不足、过程报错、资源争用等原因失败,但 scheduler 默认不会告警。
日常要盯住这几条 SQL:
- 查作业当前状态:
SELECT job_name, enabled, state, last_start_date, next_run_date FROM USER_SCHEDULER_JOBS WHERE job_name = 'JOB_MY_PROC' - 查最近 10 条执行记录:
SELECT log_date, status, error# FROM USER_SCHEDULER_JOB_LOG WHERE job_name = 'JOB_MY_PROC' ORDER BY log_date DESC FETCH FIRST 10 ROWS ONLY - 查详细错误堆栈:
SELECT * FROM USER_SCHEDULER_JOB_RUN_DETAILS WHERE job_name = 'JOB_MY_PROC' AND status = 'FAILED' ORDER BY actual_start_date DESC FETCH FIRST 1 ROW ONLY
特别注意:failure_count 字段持续增长,说明过程本身有逻辑缺陷或依赖对象权限缺失,光重启 job 解决不了问题。


















