1.创建一个存储过程
CREATE OR REPLACE PROCEDURE P_TEST AS
BEGIN
业务逻辑 ...
COMMIT;
END;
2.创建执行计划
--参数说明:
--JOBNO,定时器ID,系统自动获得,也可进行指定
--WHAT,指向所需调用的存储过程(';',---符合不可省略)
--NEXT_DATE,下次执行时间
--INTERVAL,每次间隔时间
DECLARE JOBNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOBNO=>JOBNO, -- jobno,定时器ID,系统自动获得,也可进行指定
WHAT=>'你的存储过程;', -- 调用的存储过程名称
NEXT_DATE=>sysdate, -- 设置的时间是由系统自动生成
INTERVAL=>'TRUNC(SYSDATE + 1)' —-每次间隔时间,现在是每天凌晨0点执行
);
COMMIT;
END;
3.查看调度任务
select * from user_jobs where what='你的存储过程;' ; --查看调度任务(';' ---符合不可省略)
select * from dba_jobs_running; --查看正在执行的调度任务
select * from dba_jobs; --查看执行完的调度任务
--查看你的任务 broken:Y:没启动 N:启动
select job as jobno,next_date,next_sec,failures,broken from user_jobs where what='你的存储过程;' ;
--查看任务队列情况 broken:Y:没启动 N:启动
SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS;
4.运行执行计划
-- 已知JOBNO定时器ID
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.RUN(JOBNO); --你的JOBNO定时器ID
END;
5.停止执行计划
-- 已知JOBNO定时器ID
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.BROKEN(JOBNO, TRUE); -- 停止计划,不再继续执行
END;
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.BROKEN(JOBNO, TRUE, SYSDATE + (2 / 24 / 60)); -- 停止计划,并在两分钟后继续执行
END;
6.删除执行计划
-- 已知JOBNO定时器ID
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.REMOVE(JOBNO);
END;
7.修改执行计划的间隔时间
-- 已知JOBNO定时器ID
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.INTERVAL(JOBNO, 'sysdate+1/(24*60)'); -- 修改为:每分钟执行一次
END;
8.修改下次执行时间
-- 已知JOBNO定时器ID
DECLARE
BEGIN
DBMS_JOB.NEXT_DATE(JOBNO, NEXT_DATE); --指定任务号的时间
END;
9.修改要执行的操作
-- 已知JOBNO定时器ID
-- 已知WHAT为新的存储过程
DECLARE
JOBNO INTEGER;
BEGIN
DBMS_JOB.WHAT(JOBNO,WHAT); --指定任务号以及存储过程
END;
10.常用时间设置收集
--1:每分钟定时执行
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/246060' --每30秒
--2:每天定时执行
Interval => TRUNC(sysdate+1) --每天凌晨0点执行
Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执行
Interval => TRUNC(SYSDATE+1)+(860+30)/(2460) --每天早上8点30分执行
--3:每周定时执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2点执行
--4:每月定时执行
Interval =>TRUNC(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点执行
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 => 'TRUNC(SYSDATE + 1)' --每天午夜12点
Interval => 'TRUNC(SYSDATE + 1) + (860+30)/(2460)' --每天早上8点30分
Interval => 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' --每星期二中午12点
Interval => 'TRUNC(LAST_DAY(SYSDATE ) + 1)' --每个月第一天的午夜12点
Interval => 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' --每个季度最后一天的晚上11点
Interval => 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, ''SUNDAY''))) + (6×60+10)/(24×60)' --每星期六和日早上6点10分
Interval => 'sysdate+3/(246060)' --每3秒钟执行一次
Interval => 'sysdate+2/(24*60)' --每2分钟执行一次