Oracle 定时任务dbms_job执行存储过程

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分钟执行一次
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷学习被我发现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值