创建一个定时器
DECLARE
DEAL_SHARES_FRIDAY NUMBER;
BEGIN
DBMS_JOB.SUBMIT( JOB => DEAL_SHARES_FRIDAY,
WHAT => 'calculate_shares_friday;',
NEXT_DATE => SYSDATE,
INTERVAL => 'next_day(trunc(sysdate),6)+18/24');
END;
1、DEAL_SHARES_FRIDAY NUMBER;
随意声明,定时器job的ID,类型为NUMBER,创建时系统自动生成
2、WHAT => ‘calculate_shares_friday;’
这个定时器是干啥的,这里是调用一个名叫calculate_shares_friday的存储过程,注意存储过程名后的‘;’不能少。
3、NEXT_DATE => SYSDATE,
定时器的下次执行时间,SYSDATE意为立刻执行
4、 INTERVAL => ‘next_day(trunc(sysdate),6)+18/24’);
定时器执行一次后,隔多久执行下一次,上面意为每周五的18点执行一次
查询所有的定时器
SELECT * FROM USER_JOBS;
关键字段:
last_date 上次执行开始时间
this_date 有值说明这个定时器正在执行,值为这个定时器开始执行的时间
next_date 下次执行时间
total_time 上次定时器执行完成花费的时间
broken 定时器执行标志 N意为可正常执行 Y意为定时器不再执行
interval 执行间隔
failures定时器执行失败次数
what 定时器要执行的存储过程名称
如果定时器没有按时执行
一般情况,定时器只要创建成功,都会按照定的时间自动执行,有些特殊情况下会遇到不执行的情况:
1、数据库系统时间不对
2、数据库的时区设置不对
系统时间问题容易发现,关键是时区,将近一个月没有查出导致定时器没有按时执行的原因。
SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;
查询结果应该是+08:00
针对定时器的基本操作
删除操作:
begin
dbms_job.remove(83); /*删除自动执行的job,参数是 job的id*/
commit;
end;
暂停操作:
begin
dbms_job.broken(jobId,true,next_date); /*停止一个job,jobId, job的ID,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。 */
commit;
end;
恢复运行操作:
begin
dbms_job.run(jobId);/*jobId, job的ID*/
end;
删除操作:
begin
dbms_job.remove(jobId);/*jobId, job的ID*/
end;
修改操作:
/*修改执行间隔*/
begin
dbms_job.interval(job,interval); /*job job的ID,interval: 计算下一次任务执行的时间表达式*/
commit;
end;
/*修改下次执行时间*/
begin
dbms_job.next_date(job,next_date); /*job: job 的ID;nex_date:要修改后的计算下一次执行的时间表达式*/
commit;
end;
/*修改要执行的任务*/
begin
dbms_job.what('calculate_shares_friday_b;'); /*calculate_shares_friday_b; 要更改的新操作名称*/
commit;
end;