oralce提供了一个很简便的创建定时任务的方法,即创建job,这是数据库级别的定时任务,运行时间全部由数据库控制,因此省去了开发人员的很多烦恼。
一.创建定时任务
创建的方式有两种:
1.直接创建job
可以使用以下创建语句(创建完之后会根据时间执行任务):
declare
jobno number;
begin dbms_job.submit(
jobno,–定时器ID,系统自动获得
‘proc_name;’, --执行的存储过程名
sysdate,–定时器开始执行的时间,这样写表示立即执行
‘sysdate + 15/1440’–设置定时器执行的频率,这样写每隔15分钟执行一次
);
commit;
end;
2.使用存储过程创建
创建完后需要手动执行存储过程,才会生效定时任务
create or replace procedure PROC_CREATE_JOB as
begin
declare
job number;
BEGIN
dbms_job.submit(job,–定时器ID,系统自动获得
‘proc_name;’, – 需要执行的存储过程名
sysdate, – 第一次执行的时间,sysdate表示立即执行
‘TRUNC(SYSDATE+1)+2/24’ – 下一次执行时间
);
COMMIT;
DBMS_JOB.RUN(job);
END;
end;
二.查询定时任务
select * from user_jobs;–查看调度任务
select * from dba_jobs_running;–查看正在执行的调度任务
select * from dba_jobs;–查看执行完的调度任务
三.删除定时任务
begin
dbms_job.remove(83);–83是指定时器id,通过查询定时任务获得
commit;
end;
四.修改定时任务执行时间
修改间隔时间:
begin
DBMS_JOB.INTERVAL(24, ‘sysdate + 60/1440’);–24指的是定时器id,,通过查询定时任务获得
commit;
end;
修改下次执行时间:
begin
DBMS_JOB.next_date (24, ‘sysdate + 60/1440’);–24指的是定时器id,,通过查询定时任务获得
commit;
end;
五.停止定时任务
begin
dbms_job.broken(24,true); --true表示停止,false表示启用
commit;
end;
六.修改job要执行的操作
begin
dbms_job.what(111,‘proc_name;’)
commit;
end;
七.可能会遇到的一些问题
1.创建定时任务成功,但定时任务为什么没有执行?
1)可能是执行任务的job 的临界值太小的原因,可直接使用以下语句进行查看
select value from v$parameter where name like ‘%job_queue_processes%’;
查询出来的值如果过小或为0(0代表job都不生效),则需要将该值增大,使用以下语句
alter system set job_queue_processes =100;
临界值可按目前job的数量进行具体的修改,如果job数量超过100个,那么第101个就不会执行了
2)查看该定时任务的NEXT_DATE时间是否是4000/1/1,如果是的话,查看broken状态是否是Y,是的话更改broken状态,使用如下命令:
begin
dbms_job.broken(24,false);
commit;
end;
2.停止(broken)定时任务后,为什么又重新启动了?
可能是因为是在运行过程中停止。
经测试,如果在job运行过程中执行了broken语句,在当时你查询的时候broken状态是Y,但是等定时任务执行完后,再去查看,会发现broken状态又变回了N(表示未停止)。
因此,务必在job执行完成后再停止定时任务。