在开发项目的过程中,我们需要对某个存储过程(或SQL语句)执行定时任务(比如指定每天的每个时间内执行),这时我们就需要使用到数据库任务(DBMS_JOBS)来实现。
- --查看当前用户下的数据库执行任务语句
- SELECT * FROM dba_jobs ;

选择DBMS_Jobs点击鼠标右键选则【新建】,在What值输入需执行的存储过程名称及其对应参数,在输入时间间隔,最后点击应用即可。
- --通过SQL创建DBMS_Jobs(模板)
- declare
- job number;
- BEGIN
- DBMS_JOB.SUBMIT(
- JOB => job, /*自动生成JOB_ID*/
- WHAT =>'storedProcedureName(Param);', /*需执行的存储过程名称或SQL语句*/
- NEXT_DATE => sysdate, /*初次执行时间(立即执行)*/
- INTERVAL => 'TRUNC(sysdate+1) + (8.5*60)/ (24 * 60)' /*执行间隔(每隔一天的早上8点半执行)*/
- );
- commit;
- end;
-
-
- --示例程序(每天早上8:30执行【TESTINUPTOUTPUT】存储过程且指定固定参数为1000)
- declare
- job number;
- begin
- sys.dbms_job.submit(
- job => job,
- what => 'declare inputInfo varchar2(50):=''1000'';
- begin
- TESTINUPTOUTPUT(inputInfo);
- end;',
- interval => 'TRUNC(sysdate+1) + (8.5*60)/ (24 * 60)');
- commit;
- end;
- --运行DBMS_JOBS的SQL语句
-
- BEGIN
-
- dbms_job.run(任务编号);
-
- END;
运行dbms_Job示例如下:

- --手动停止某个DBMS_Job
-
- /*
- 格式:dbms_job.broken(jobId,broken,next_date);
- jobId:定时任务的编号(DBMS_Job)
- broken:值为true时,表示禁用job;值为false时,表示启用job。
- next_date:(某一时刻停止),也可是sysdate(立刻停止)(默认值为sysdate)。
- */
- BEGIN
- dbms_job.broken (jobId, TRUE, next_date) ;
- COMMIT ;
- END ;
运行停止DMBS_Job任务示例如下:

- --修改定时任务的时间间隔
-
- /*
- jobId:任务的编号
- interval: 任务执行间隔的时间表达式
- */
-
- begin
- dbms_job.interval(jobId,interval);
- commit;
- end;
运行示例如下:

- --修改定时任务的下一次执行时间
-
- /*
- jobId:任务的编号
- next_date: 下一次任务执行的时间表达式
- */
- begin
- dbms_job.next_date(jobId,next_date);
- commit;
- end;
运行示例:

- --修改定时任务要执行的操作
-
- /*
- jobId:任务的编号
- newStoredProcedure: 修改为的新存储过程
- */
- begin
- dbms_job.what(jobId,'newProcedures;');
- commit;
- end;
运行示例如下:

- --删除定时任务的SQL语句
- /*
- Jobid:表示需删除的任务编号
- */
-
- begin
- dbms_job.remove(Jobid);
- commit;
- end;
运行示例如下:

| 序号 | 说明 | 时间间隔表达式 |
| 1 | 时间间隔为1分钟 | trunc(sysdate,'mi') + 1/ (24*60) 或 sysdate + 1 / (24 * 60) |
| 2 | 时间间隔为1小时 | sysdate + 1/24 from |
| 3 | 时间间隔为每天凌晨1点 | trunc(sysdate+ 1) +1/ (24) |
| 4 | 时间间隔为每周一凌晨1点 | trunc(next_day(sysdate,'星期一'))+1/24 |
| 5 | 时间间隔为每月1日凌晨1点 | trunc(LAST_DAY(SYSDATE))+1+1/24 |
| 6 | 时间间隔为每季度的第一天凌晨1点 | trunc(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 |
| 7 | 时间间隔为每半年定时执行【10月1日和1月1日凌晨1点】 | ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 |
| 8 | 时间间隔为每年定时执行【每年1月1日凌晨1点】 | ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 |