Oracle定时任务配置指南:如何设置存储过程自动执行,解决定时调度难题

文章导读
Oracle 定时任务配置主要通过 DBMS_JOB 或 DBMS_SCHEDULER 包实现。首先需确保数据库参数 job_queue_processes 和 aq_tm_processes 已启用,否则任务无法调度。创建存储过程封装业务逻辑,并通过提交作业指定执行间隔,如每天零点或每小时。使用 DBMS_SCHEDULER 更推荐,支持复杂日历调度。配置后需监控 USER_SCHEDULER_
📋 目录
  1. Oracle 数据库定时任务
  2. 关于 Oracle Job 定时任务配置讲解
  3. oracle 定时任务常用攻略 - 墨天轮
  4. FAQ
A A

Oracle 定时任务配置主要通过 DBMS_JOB 或 DBMS_SCHEDULER 包实现。首先需确保数据库参数 job_queue_processes 和 aq_tm_processes 已启用,否则任务无法调度。创建存储过程封装业务逻辑,并通过提交作业指定执行间隔,如每天零点或每小时。使用 DBMS_SCHEDULER 更推荐,支持复杂日历调度。配置后需监控 USER_SCHEDULER_JOBS 视图确认状态,若任务失败需检查存储过程异常处理及权限设置,确保自动化流程稳定运行。

Oracle 数据库定时任务

定时任务是 Oracle 数据库里的自动化小能手 通过 DBMS JOB 包实现 能定时或周期性地执行存储过程 超适合数据维护 报表生成这些重复活儿 比起操作系统定时任务 它更可靠 重启也不怕 还少了网络传输的麻烦 效率杠杠的 用定时任务前 得先准备好存储过程 就像做饭前备好菜一样 存储过程里可以写复杂的业务逻辑 记得加上异常处理哦 出错时才能从容应对 创建定时任务 就用 DBMS JOB.SUBMIT 过程 定好任务编号 要执行的代码和执行间隔就 OK 啦 时间参数设置超灵活 分钟 小时 天 周 想怎么调就怎么调 管理定时任务也不难 监控查询用 DBA JOBS 或 USER JOBS 视图 任务状态用 DBMS JOB.BROKEN 和 DBMS JOB.RUN 来控制(2026 年 4 月 4 日的资料)

关于 Oracle Job 定时任务配置讲解

几天前,公司的 job 调度出现了问题,由于权限管的严,没有查看 Oracle 一些重要的数据字典,后面联系 DBA,是由于数据库切换到备机时,参数设置不对,导致 db job 没有正常调度。今天刚好有时间,想总结下 Oracle 的定时任务,写的不好的地方,请多多指教!--1.先检查 oracle job 两个重要参数 job_queue_processes 和 aq_tm_processes SQL> show parameter job_queue_processes; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ job_queue_processes integer 0 SQL> show parameter aq_tm_processes; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ aq_tm_processes integer 0 --2.新建一个序列,作为数据来源 -- Create sequence create sequence s_seq minvalue 0 maxvalue 10000 start with 1 increment by 1 order; --3.新建一张测试表 --create table create table t_job( id number, record_time date ); --4.创建一个存储过程; create or replace procedure proc_test_job as begin insert into t_job (id,record_time) select s_seq.nextval,sysdate from dual; commit; end proc_test_job; / --5.创建一个定时任务 declare job_number number; cursor job_cursor is select * from user_jobs where what like '%proc_test_job%'; begin for x in job_cursor loop job_number:=x.job; sys.dbms_job.remove(job_number); end loop; commit; -- Call the procedure sys.dbms_job.submit(job => job_number, --out 参数,job 编号 what => 'proc_test_job;', --注意有分号 next_date => sysdate + 5/(24*60), --下一个 5 分钟执行 interval => 'trunc(sysdate,''mi'')+1/(24*60)' --每隔一分钟执行 ); commit; end; / --6.查看 job 的信息 select t.JOB, t.NEXT_DATE, t.WHAT, t.INTERVAL, t.* from user_jobs t where t.WHAT like '%proc_test_job%'; --7.设置 第 1 步中的两个参数 SQL> alter system set job_queue_processes = 10 scope = both; System altered SQL> alter system set aq_tm_processes = 1 scope = both; System altered --8.查看 job 的信息以及目标表的数据,从以下查看,确实是每隔 1 分中执行一次 这样就完成了一个 OracleJob 定时任务的配置了。在实际工作,由于业务的需要,比如公司经常做活动,那可能会经常调整 db job 调度时间。(截至 2026 年 4 月 3 日)

Oracle定时任务配置指南:如何设置存储过程自动执行,解决定时调度难题

oracle 定时任务常用攻略 - 墨天轮

在 Oracle 19c 中,若想创建个定时任务,可以通过 DBMS_SCHEDULER 或 DBMS_JOB 来创建定时任务,确保存储过程 pro_test 每天零点自动执行一次。1. 创建作业 1.1.授权说明 -- 授权创建 JOB 权限 GRANTCREATEJOBTO-- 若要存储过程属于其他用户,需要授权 GRANTEXECUTEONPRO_TESTTO; 1.2.创建作业 (Job) BEGINDBMS_SCHEDULER.CREATE_JOB ( job_name =>'JOB_PRO_TEST_DAILY',-- 作业名称 job_type =>'STORED_PROCEDURE',-- 作业类型 (存储过程) job_action =>'PRO_TEST',-- 存储过程名 start_date => SYSTIMESTAMP,-- 开始时间 (立即生效) repeat_interval =>'FREQ=DAILY; BYHOUR=0; BYMINUTE=0; BYSECOND=0',-- 每天零点执行 enabled =>TRUE,-- 启用作业 comments =>'Daily execution of PRO_TEST at midnight');END; / 关键参数说明 repeat_interval: FREQ=DAILY:每天执行。BYHOUR=0:在 0 点执行。BYMINUTE=0 和 BYSECOND=0:精确到 00:00:00。1.3.手动执行进行测试 BEGINDBMS_SCHEDULER.RUN_JOB('JOB_PRO_TEST_DAILY');END; / 2.查看 DBMS_SCHEDULER 作业的详细信息 2.1 查询*_SCHEDULER_JOBS 视图 -- 查看当前用户下的作业 SELECTjob_name, job_type, job_action, start_date, repeat_interval, enabled, stateFROMUSER_SCHEDULER_JOBS;-- 查看所有作业 (需 DBA 权限) SELECTjob_name, owner, job_type, job_action, start_date, repeat_interval, enabled, stateFROMDBA_SCHEDULER_JOBS; 2.2 查询*_SCHEDULER_PROGRAMS(如果作业关联了程序) SELECTprogram_name, program_type, program_actionFROMUSER_SCHEDULER_PROGRAMS; 2.3 查询*_SCHEDULER_JOB_ARGS(查看作业参数) SELECTjob_name, argument_name, argument_valueFROMUSER_SCHEDULER_JOB_ARGSWHEREjob_name ='JOB_PRO_TEST_DAILY'; 2.4 使用 DBMS_SCHEDULER.GET_ATTRIBUTE 获取作业属性 DECLAREv_repeat_intervalVARCHAR2(1000);BEGINDBMS_SCHEDULER.GET_ATTRIBUTE(name=>'JOB_PRO_TEST_DAILY',attribute=>'repeat_interval',value=> v_repeat_interval ); DBMS_OUTPUT.PUT_LINE('Repeat Interval: ' || v_repeat_interval);END; / 3.查看作业运行状况 -- 查看作业运行历史 SELECTjob_name,status, log_date, run_durationFROMUSER_SCHEDULER_JOB_RUN_DETAILSWHEREjob_name ='JOB_PRO_TEST_DAILY';-- 查看作业错误日志 SELECTjob_name,status,error#, error_msgFROMUSER_SCHEDULER_JOB_RUN_DETAILSWHEREstatus='FAI(消息于 2025 年 3 月 25 日发布)

FAQ

Oracle 定时任务不执行常见原因有哪些?

常见原因包括数据库参数 job_queue_processes 设置为 0 导致调度器未启动,存储过程内部存在逻辑错误导致连续失败被标记为 BROKEN,或者用户权限不足无法执行特定对象。

Oracle定时任务配置指南:如何设置存储过程自动执行,解决定时调度难题

DBMS_JOB 和 DBMS_SCHEDULER 有什么区别?

DBMS_JOB 是较旧的包,配置简单但功能有限;DBMS_SCHEDULER 是新一代调度器,支持更复杂的日历调度、作业链、资源管理及更详细的日志监控,推荐在新版本中使用。