Oracle定时任务
Oracle定时任务
一、创建语句
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'proc_cam;',
NEXT_DATE => to_date('2022-03-14 15:40:00', 'yyyy-mm-dd hh24:mi:ss'),
INTERVAL => 'sysdate+30/(24*60)' /*每隔30分钟执行一次*/
);
commit;
end;
参数含义:
JOB:指定定时任务的 JOB_ID,上面代码指自动生成;
WHAT:需要执行的存储过程名称或SQL语句,多个以分号隔开,注意最后有个分号;
NEXT_DATE:初次执行时间;
INTERVAL:多久执行一次。
二、查询定时任务
当前用户定时任务
select * from user_jobs;
有权限访问的定时任务
select * from all_jobs;
整个数据库所有的定时任务
select * from dba_jobs;
查询上面例子创建的定时任务:select * from dba_jobs where what like '%proc_cam%';
三、任务时间间隔设计
指定两次任务执行的时间间隔
描述 | interval 参数值 |
---|---|
每天执行一次 | 'SYSDATE+1′ |
每小时执行一次 | 'SYSDATE+1/24' |
每10分钟执行一次 | 'SYSDATE+10/(24*60)' |
每30秒执行一次 | 'SYSDATE+30/(24*60*60)' |
每个星期执行一次 | 'SYSDATE+7' |
也可以指定具体时间
描述 | 参数值 |
---|---|
每天6点 执行 | 'Trunc(Sysdate+1) + 6/24' |
每天08:10:00 执行 | 'Trunc(Sysdate+1) + (8*60+10)/24*60' |
每周一凌晨1点执行 | ' TRUNC(next_day(sysdate,"星期一"))+1/24' |
每月1日凌晨1点执行 | ' TRUNC(LAST_DAY(SYSDATE))+1+1/24' |
四、操作
手动执行定时任务
BEGIN
DBMS_JOB.RUN(1283); --1283为JOB任务的 ID
commit;
END;
停止定时任务
BEGIN
dbms_job.broken(1283,true,sysdate); --1283为JOB任务的 ID,sysdate是指在指定时间停止
commit;
END;
删除定时任务
begin
dbms_job.remove(1283); --1283为JOB任务的 ID
commit;
end;
修改定时任务的时间间隔
begin
dbms_job.interval(1283,interval => 'TRUNC(SYSDATE)+1'); /*第一个参数为job的ID,第二个参数为interval: 计算下一次任务执行的时间表达式*/
commit;
end;
修改下一次执行时间
begin
dbms_job.next_date(1283,to_date('2022-03-15 12:00:00','yyyy-mm-dd hh24:mi:ss')); /*第一个参数:job的ID;第二个参数:要修改后的计算下一次执行的时间表达式*/
commit;
end;
修改定时任务要执行的操作
begin
dbms_job.what(1283,'testJob2();'); /* 第一个参数:job的ID;第二个参数:要更改的新操作名称(存储过程名称或SQL语句,必须存在)*/
commit;
end;