Oracle-定时任务.md 4.4 KB

创建

-- 创建定时任务
DECLARE 
	jobno NUMBER;
BEGIN
	dbms_job.submit (
		jobno, -- 定时器ID,系统自动获得
        'PRC_INSERT;', -- what执行的过程名,多个存储过程以";"分隔,末尾要带";"
        SYSDATE, -- next_date,定时器开始执行的时间,这样写表示立即执行
        'sysdate+15/(24*60)' -- interval,设置定时器执行的频率,这样写每隔15分钟执行一次
	);
	COMMIT;
END;

查看

-- 查询定时任务(包括定时任务号)
select dj.job, dj.what, dj.last_date, dj.next_date, dj.interval
from dba_jobs dj 
where upper(dj.what) like '%P_SYN_PRODUCT%'
order by dj.NEXT_DATE asc;

-- 查看正在执行的调度任务
select * from dba_jobs_running;

-- 查看正在执行的调度任务
select jr.*, j.WHAT from dba_jobs_running jr
join dba_jobs j ON j.JOB=jr.JOB


-- 有权限访问的定时任务
select job, what, last_date, next_date
from all_jobs
order by last_date desc;
-- 整个数据库所有定时任务
select job, what, last_date, next_date
from dba_jobs
order by last_date desc;

-- 查询执行任务的job 的临界值是多少
select value from v$parameter where name like '%job_queue_processes%';
-- 修改job的临界值
alter system set job_queue_processes =100;

删除

-- 1、删除定时任务的存储过程 
BEGIN
  -- 210为job的id,此id不是随便填写的,而是执行select * from user_jobs;
  -- 查询到定时任务名称对应的id
  dbms_job.remove(210); 
  commit;
END;
-- 2、也可以使用以下删除方式
-- 删除一个定时器
call dbms_job.remove(83);

修改

-- 3、停止一个定时器
-- 这个过程有三个参数:job 、broken与next_date。
PROCEDURE Broken (job IN binary_integer,  
           Broken IN boolean,  
           next_date IN date :=SYSDATE);
-- 停止一个job。jobId:job的ID;
-- 第二个参数指示此定时任务是否将标记为破——true说明此定时任务将标记为broken,而false说明此定时任务将标记为未broken。
-- next_date(某一时刻停止)也可是sysdate(立刻停止)。
begin   
  dbms_job.broken(jobId,true,next_date);        
  commit;
end;

-- 修改broken为N
begin 
  dbms_job.broken(jobId, false, next_date);
  commit;
end;

-- 启动一个定时器,同时也会立即执行
call DBMS_JOB.run(83);

-- 修改字段 what 
call dbms_job.what(job, what);  

-- 修改字段 next_date
call dbms_job.next_date(job, next_date);
-- 例子:修改定时任务的下次执行时间
call dbms_job.next_date(183, to_date('2022-06-15 05:00:00', 'yyyy-mm-dd hh24:mi:ss'));

-- 修改字段 interval
call dbms_job.interval(job, interval); 
-- 例子:修改定时任务每天5点执行
call dbms_job.interval(183, 'TRUNC(SYSDATE+1)+5/24'); 
-- 例子:每隔1小时执行一次
call dbms_job.interval(183, 'SYSDATE+1/24'); 

常见 interval 设置

每天午夜12点           TRUNC(SYSDATE + 1) 
每天早上8点30分         TRUNC(SYSDATE + 1) + (8*60+30)/(24*60) 
每星期二中午12点        NEXT_DAY(TRUNC(SYSDATE ), '星期二' ) + 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, '星期六'), NEXT_DAY(SYSDATE, "星期日"))) + (6×60+10)/(24×60)
 
每秒钟执行次 sysdate + 1/(24 * 60 * 60)
如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次
 
每分钟执行 TRUNC(sysdate,'mi') + 1/ (24*60)
如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次
 
每天定时执行 
例如:每天的凌晨1点执行 
TRUNC(sysdate) + 1 +1/ (24)
 
每周定时执行 
例如:每周一凌晨1点执行 
TRUNC(next_day(sysdate,'星期一'))+1/24
 
每月定时执行 
例如:每月1日凌晨1点执行 
TRUNC(LAST_DAY(SYSDATE))+1+1/24
 
每季度定时执行 
例如每季度的第一天凌晨1点执行  
TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
 
每半年定时执行 
例如:每年7月1日和1月1日凌晨1点 
ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
 
每年定时执行 
例如:每年1月1日凌晨1点执行 
ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

PLSQL操作

image-20220312140626384

参考: https://blog.csdn.net/www1056481167/article/details/84637674 https://www.cnblogs.com/leihongnu/p/15378805.html https://www.cnblogs.com/yx007/p/6519544.html