## 创建 ```sql -- 创建定时任务 DECLARE jobno NUMBER; BEGIN dbms_job.submit ( jobno, -- 定时器ID,系统自动获得 'PRC_INSERT;', -- what执行的过程名,多个存储过程以";"分隔,末尾要带";" SYSDATE, -- next_date,定时器开始执行的时间,这样写表示立即执行 'sysdate+15/(24*60)' -- interval,设置定时器执行的频率,这样写每隔15分钟执行一次 ); COMMIT; END; ``` ## 查看 ```sql -- 查询定时任务(包括定时任务号) 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; ``` ## 删除 ```sql -- 1、删除定时任务的存储过程 BEGIN -- 210为job的id,此id不是随便填写的,而是执行select * from user_jobs; -- 查询到定时任务名称对应的id dbms_job.remove(210); commit; END; -- 2、也可以使用以下删除方式 -- 删除一个定时器 call dbms_job.remove(83); ``` ## 修改 ```sql -- 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 设置 ```sql 每天午夜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](./imgs/image-20220312140626384.png) >参考: >https://blog.csdn.net/www1056481167/article/details/84637674 >https://www.cnblogs.com/leihongnu/p/15378805.html >https://www.cnblogs.com/yx007/p/6519544.html