使用oracle数据库执行定时任务(添加、修改、删除)可采用定时执行存储过程来是实现。

1、创建存储过程

create or replace procedure test as 
begin 
insert into test values(xxx,xxx,xxx); 
commit;
end; 

具体请参考 oracle存储过程

2、创建执行计划

参数说明: 
declare
jobno number;
begin
 DBMS_JOB.SUBMIT
    (jobno =>  -- jobno,定时器ID,系统自动获得,也可进行指定
     what => 'your_procedure;',  --调用的存储过程名称
     next_date => sysdate,   -- 设置的时间是由系统自动生成,可以根据自己的需要设置该时间
     interval => 'sysdate+1+5/(24)');--多长时间调用一次,时间间隔是每小时,根据需要可以自己设置
commit;
end;

具体写法为:
 declare
   jobno number;
 begin
   dbms_job.submit(jobno,             
                   '存储过程名称;', 
                   sysdate,         
                   '定时执行时间');-- trunc(sysdate+1) +3/24 每天凌晨3点 
	commit;
 end;

3、查看定时计划

定时计划创建后可查询user_jobs表查看创建的任务

 select *  from user_jobs; -- 当前用户拥有的任务
 select * from dba_jobs; -- 本数据库中定义到任务队列中的任务
 select * from DBA_JOBS_RUNNING; -- 目前正在运行的任务

user_jobs表字段详解
image.png

4、对创建的定时计划进行操作

一下内容中的jobno为user_jobs表的唯一标识号(JOB)

4.1停止执行计划

Declare 
  jobno Integer; 
Begin 
  dbms_job.broken(jobno,True);   -- 停止计划,不再继续执行 
  dbms_job.broken(jobno,True,Sysdate+(2/24/60));-- 停止计划,并在两分钟后继续执行 根据业务场景写一个即可
end; 

4.2运行执行计划

Declare 
  jobno Integer; 
Begin 
dbms_job.run(jobno); -- 运行制定的执行计划 
end; 

4.3删除执行计划

Declare 
  jobno Integer; 
Begin 
  dbms_job.remove(jobno); 
end; 

4.4修改执行计划的间隔时间

Declare 
  jobno Integer; 
Begin 
  dbms_job.interval(jobno, 'sysdate+1/(24*60)');   -- 修改为:每分钟执行一次 
end; 

4.5修改要执行的操作:

Declare 
  jobno Integer; 
Begin 
  dbms_job.what(jobno, what);    --指定任务号以及存储过程
end; 

4.6修改下次执行时间:

Declare 
begin
dbms_job.next_date(jobno, next_date);  --指定任务号的时间
end;

5、运行时间(interval)的计算

 通用公式 :那一天 + (几时*60+几分)/(24*60)
例如: 每天的9点20 TRUNC(SYSDATE+1) + (9*60+20)/(24*60)

天数表达式参考:
每天:TRUNC(SYSDATE+1)
每周:TRUNC(SYSDATE+7)
每月:TRUNC(SYSDATE+30)
注:TRUNC(SYSDATE ) 表示的是今天的0点0分0秒 SYSDATE 表示当前时间

表达式参考

sysdate+1              表示每天执行一次
sysdate+1/24           表示每小时执行一次
sysdate+1/(24*60)      表示每分钟执行一次
sysdate+1/(24*60*60)   表示每秒执行一次