一、业务需求
在开发项目的过程中,我们需要对某个存储过程(或SQL语句)执行定时任务(比如指定每天的每个时间内执行),这时我们就需要使用到数据库任务(DBMS_JOBS)来实现。
二、实现方法
2.1、查询当前运行的数据库任务语句
--查看当前用户下的数据库执行任务语句
SELECT * FROM dba_jobs ;
2.2、使用PL/SQL创建dbms_jobs
选择DBMS_Jobs点击鼠标右键选则【新建】,在What值输入需执行的存储过程名称及其对应参数,在输入时间间隔,最后点击应用即可。
2.3、通过SQL语句创建DBMS_Jobs
--通过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;
2.4、运行DBMS_Jobs的SQL语句
--运行DBMS_JOBS的SQL语句
BEGIN
dbms_job.run(任务编号);
END;
运行dbms_Job示例如下:
2.5、 停止DBMS_Jobs的SQL语句
--手动停止某个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任务示例如下:
2.6、修改定时任务(DBMS_Jobs)的SQL语句
2.6.1、修改定时任务的执行间隔
--修改定时任务的时间间隔
/*
jobId:任务的编号
interval: 任务执行间隔的时间表达式
*/
begin
dbms_job.interval(jobId,interval);
commit;
end;
运行示例如下:
2.6.2、修改定时任务的下次执行时间
--修改定时任务的下一次执行时间
/*
jobId:任务的编号
next_date: 下一次任务执行的时间表达式
*/
begin
dbms_job.next_date(jobId,next_date);
commit;
end;
运行示例:
2.6.3、修改定时任务要执行的操作(或存储过程)
--修改定时任务要执行的操作
/*
jobId:任务的编号
newStoredProcedure: 修改为的新存储过程
*/
begin
dbms_job.what(jobId,'newProcedures;');
commit;
end;
运行示例如下:
2.7、删除定时任务的SQL语句
--删除定时任务的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 |