1. 首先创建一个存储过程,即需要定时执行的任务内容
create or replace
procedure 存储过程名 as
begin
执行内容;
commit;
end;
例定时修改某个表信息:
create or replace procedure AUTO_MODIFY_GI as
begin
update material_operation_record_info m
set m.issuedate = m.issuedate - 1, m.flag_id = '0'
where m.flag_id = '1'
and m.issuedate >=
to_date('2022-08-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and m.issuedate <
to_date('2022-08-31 08:30:00', 'yyyy-mm-dd hh24:mi:ss');
commit;
end;
2. 创建调度任务
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => '存储过程名;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate+3/(24*60), /*初次执行时间-下一个3分钟*/
INTERVAL => 'trunc(sysdate,''mi'')+5/(24*60)' /*每隔5分钟执行一次*/
);
commit;
end;
例每隔5分钟执行一次操作:
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(JOB => job, /*自动生成JOB_ID*/
WHAT => 'AUTO_MODIFY_GI;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate + 3 / (24 * 60), /*初次执行时间-下一个3分钟*/
INTERVAL => 'trunc(sysdate,''mi'')+5/(24*60)' /*每隔5分钟执行一次*/);
commit;
end;
3. job相关操作
1、定时任务查询
-- 查看正在执行的调度任务
select * from dba_jobs_running;
-- 查看执行完的调度任务
select * from dba_jobs;
2、手动启动定时任务
begin
dbms_job.run(24);
commit;
end;
3、暂停正在启动的定时任务
begin
dbms_job.broken(24, TRUE, SYSDATE);
commit;
end;
4、删除正在执行的定时任务
begin
dbms_job.remove(23);
commit;
end;
5、修改定时任务间隔时间
begin
dbms_job.interval(24, 'sysdate + 6 / (24 * 60)');
commit;
end;
6、修改定时任务下次执行时间
begin
dbms_job.next_date(24, sysdate + 10 / (24 * 60));
commit;
end;
7、修改定时任务执行操作
begin
dbms_job.what(24, 'AUTO_MODIFY_GI_DATA;'); --修改某个job名
commit;
end;
注:执行时间参考如下
TRUNC(SYSDATE,'mi') + 1/(24*60)--每分钟执行
TRUNC(SYSDATE,'mi') + 5/(24*60)--每五分钟执行
TRUNC(SYSDATE,'mi') + 1/24--每小时执行
TRUNC(SYSDATE,'mi') + 5/24--每隔五小时执行
TRUNC(SYSDATE) + 1 +2/(24)--每天的凌晨2点执行
TRUNC(SYSDATE) + 5 +2/(24)--每隔5天的凌晨2点执行
TRUNC(NEXT_DAY(SYSDATE,2))+2/24 --星期一(一周的第二天)--每周一凌晨2点执行
TRUNC(NEXT_DAY(SYSDATE,7))+2/24 --星期六(一周的第七天)--每周六凌晨2点执行
TRUNC(LAST_DAY(SYSDATE))+1+2/24--每月1日凌晨2点执行
TRUNC(LAST_DAY(SYSDATE))+5+10/24--每月5日上午10点执行
TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24--每季度的第一天凌晨2点执行