1.编写自己的存储过程
create or replace procedure update_job_sal is
v_sql varchar2(1000);
begin
v_sql:='truncate table t';
execute immediate v_sql;
insert into t (username,sal) values('aa',100);
update t_job_sal a set sal=(select sal from t b where a.username=b.username);
end;
2.创建定时任务
declare
job1 number;
begin
dbms_job.submit(job1,'update_job_sal;',SYSDATE,'TRUNC(LAST_DAY(SYSDATE)+5)');
--每月5号0晨执行过程
commit;
end;
declare
variable job number;
begin
sys.dbms_job.submit(job => :job,
what => 'prc_name;',
next_date => to_date('22-11-2013 09:09:41', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'sysdate+1/86400');--每天86400秒钟,即一秒钟运行prc_name过程一次
commit;
end;
系统会自动分配一个任务号jobno,可以通过查询user_jobs ,all_jobs,dba_jobs得到
3.查询定时任务
select JOB,BROKEN,WHAT,INTERVAL from user_jobs
4.手动执行定时任务
begin
dbms_job.run(253);
end;
即忽略设定的时间间隔直接执行what中指定的任务
5.修改定时任务
修改要执行的操作: dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job: dbms.broken(job,broken,nextdate);
启动job: dbms_job.run(jobno);
6.删除定时任务
begin
dbms_job.remove(253); --user_jobs表中的定时任务job值
commit;
end;
7.补充说明
1)参数解释:
dbms_job.submit( job1, —-job号'your_procedure;',—-执行的存储过程, ';'不能省略
next_date, —-下次执行时间
'interval' —-每次间隔时间,interval以天为单位
);
程序主体有四个参数,分别意为:job1是计划任务号,任务创建后用来接收任务号,'your_procedure'是计划任务名,如果是多个计划任务,就都用分号隔开,第三个sysdate意为立即执行此任务,第四个参数是间隔时间的设置
2)执行时间设定举例:
每分钟执行 Interval => TRUNC(sysdate,'mi') + 1 / (24*60)
每天定时执行 :每天的凌晨2点执行 Interval => TRUNC(sysdate) + 1 +2 / (24)
每周定时执行:每周一凌晨2点执行 Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
每月定时执行:每月1日凌晨2点执行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
每季度定时执行 :每季度的第一天凌晨2点执行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
每半年定时执行:每年7月1日和1月1日凌晨2点 Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
每年定时执行:每年1月1日凌晨2点执行 Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24
8.数据库参数
初始化相关参数job_queue_processes
job_queue_process表示oracle能够并发的job的数量,当job_queue_process值为0时表示全部停止oracle的job。
1)查看job_queue_processes参数
方法一:
show parameter job_queue_process;
方法二:
select * from v$parameter where name='job_queue_processes';
2)修改job_queue_processes参数
alter system set job_queue_processes = 10;
3)user_jobs表结构
字段(列) 类型 描述
job number 任务的唯一标示号
log_user varchar2(30) 提交任务的用户
priv_user varchar2(30) 赋予任务权限的用户
schema_user varchar2(30) 对任务作语法分析的用户模式
last_date date 最后一次成功运行任务的时间
last_sec varchar2(8) 如hh24:mm:ss格式的last_date日期的小时,分钟和秒
this_date date 正在运行任务的开始时间,如果没有运行任务则为null
this_sec varchar2(8) 如hh24:mm:ss格式的this_date日期的小时,分钟和秒
next_date date 下一次定时运行任务的时间