平时工作多数业务的数据,需要有时间截点截止当天24点,定时执行计划还是用的比较多的。终于有时间手动整理总结一些内容了。
首先用一个完整的例子来实现定时执行存储过程。
任务目标:每小时向test表中插入一条数据
实现方案:
1.通过 oracle 中 dbms_job 完成存储过程的定时调用
2.在存储过程中完成相应的逻辑操作
实现步骤:
1.创建一个测试表
create table test(dTime date);
2.创建一个存储过程
create or replace procedure p_test as
begin
insert into test values(sysdate);
commit;
end;
3.创建执行计划:每小时运行一次存储过程
参数说明:
declare
jobno number;
begin
DBMS_JOB.SUBMIT
(jobno => --代表的是号码,第几个定时任务
what => 'your_procedure;', --调用的存储过程名称
next_date => sysdate, --下次执行的时间(第一次执行的时间)
interval => 'sysdate+1+5/(24)');--这个是间隔时间
commit;
Declare
i Integer;
Begin
dbms_job.submit(i,'p_test;',Sysdate,'sysdate+1/24');
end;
--查看任务队列情况
select job as jobno,next_date,next_sec,failures,broken from user_jobs where what='your_procedure' ;
broken:Y:没启动 N:启动
4.运行执行计划
Declare
jobno Integer;
Begin
dbms_job.run(jobno); -- 运行制定的执行计划
end;
5.停止执行计划
Declare
jobno Integer;
Begin
dbms_job.broken(jobno,True); -- 停止计划,不再继续执行
dbms_job.broken(jobno,True,Sysdate+(2/24/60)); -- 停止计划,并在两分钟后继续执行
end;
6.删除执行计划
Declare
jobno Integer;
Begin
dbms_job.remove(jobno);
end;
7.修改执行计划的间隔时间
Declare
jobno Integer;
Begin
dbms_job.interval(jobno, 'sysdate+1/(24*60)'); -- 修改为:每分钟执行一次
end;
8.修改要执行的操作:
Declare
jobno Integer;
Begin
dbms_job.what(jobno, what); --指定任务号以及存储过程
end;
9.修改下次执行时间:
declare
begin
dbms_job.next_date(jobno, next_date); --指定任务号的时间
end;
10.时间
sysdate+1 表示每天执行一次
sysdate+1/24 表示每小时执行一次
sysdate+1/(24*60) 表示每分钟执行一次
sysdate+1/(24*60*60) 表示每秒执行一次
Sysdate+5 加5天,
Sysdate+5/24 加5小时,
Sysdate+5/24/60 加5分钟,
Sysdate+5/24/60/60 加5秒
.INTERVAL参数常用值示例
每天午夜12点 ”TRUNC(SYSDATE + 1)”
每天早上8点30分 ”TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)”
每星期二中午12点 ”NEXT_DAY(TRUNC(SYSDATE ), ””TUESDAY”” ) + 12/24”
每个月第一天的午夜12点 ”TRUNC(LAST_DAY(SYSDATE ) + 1)”
每个季度最后一天的晚上11点 ”TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ”Q” ) -1/24”
每星期六和日早上6点10分 ”TRUNC(LEAST(NEXT_DAY(SYSDATE, ””SATURDAY”), NEXT_DAY(SYSDATE, “SUNDAY”))) + (6×60+10)/(24×60)”
每3秒钟执行一次 ‘sysdate+3/(24*60*60)’
每2分钟执行一次 ‘sysdate+2/(24*60)’
每分钟执行
Interval => TRUNC(sysdate,’mi’) + 1/ (24*60) –每分钟执行
interval => ‘sysdate+1/(24*60)’ –每分钟执行
interval => ‘sysdate+1’ –每天
interval => ‘sysdate+1/24’ –每小时
interval => ‘sysdate+2/24*60’ –每2分钟
interval => ‘sysdate+30/24*60*60’ –每30秒
2:每天定时执行
Interval => TRUNC(sysdate+1) –每天凌晨0点执行
Interval => TRUNC(sysdate+1)+1/24 –每天凌晨1点执行
Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) –每天早上8点30分执行
3:每周定时执行
Interval => TRUNC(next_day(sysdate,’星期一’))+1/24 –每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,1))+2/24 –每周一凌晨2点执行
4:每月定时执行
Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) –每月1日凌晨0点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 –每月1日凌晨1点执行
5:每季度定时执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),’q’) –每季度的第一天凌晨0点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),’q’) + 1/24 –每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),’q’)-1/24 –每季度的最后一天的晚上11点执行
6:每半年定时执行
Interval => ADD_MONTHS(trunc(sysdate,’yyyy’),6)+1/24 –每年7月1日和1月1日凌晨1点
7:每年定时执行
Interval =>ADD_MONTHS(trunc(sysdate,’yyyy’),12)+1/24 –每年1月1日凌晨1点执行