在大的项目开发中,封装底层访问数据库的代码常见于使用存储过程,易于维护和扩展。介于不同的业务逻辑,有时会用到job。同时在工作中,时长用到数据沉淀,方便写语句统计实时月报和日报表。也经常用到job。
job是一种oracle定时器
先上一段代码:
variable ps_job1 number;
begin
dbms_job.submit(:ps_job1,'p_sm_test;',to_date('2017-04-21 02:20:00', 'yyyy-mm-dd hh24:mi:ss'),'trunc(sysdate+1, ''dd'')+2/24');
dbms_job.run(:ps_job1);
end;
/
以上功能定义了'p_sm_test' 这个过程在'2017-04-21'的02:20执行,依次+1天,每日执行一次。job参数是由submit()过程返回的唯一标识来控制一条任务。相信通过以上代码,大家能体会到每个参数所代表的意义。
下面给出一些常用的执行频率,以供参考:
1、每分钟执行:trunc(sysdate,'mi')+1/(24*60)
2、每天定时执行:trunc(sysdate+1, ''dd'')+2/24'
3、每月定时执行:eg:每月1日凌晨2点:trunc(last_day(sysdate)+1+2/24
基本都是这么演化的,可以通过dual表去编写自己想要的时间。
在以上的脚本执行完成后,往往会生成一个job_id,需要及时备注一下。
可以通过这个id去找到执行情况,当然只是上次执行的时间,和执行是否成功,并不能定位里面的过程是否正确跑完,需要自行在过程内添加日志来监控。
select a.* from user_jobs a where a.job ='413';
如果发现执行时间有误,可以通过以下语句来修改,同时也用到了job_id:
exec DBMS_JOB.change(414, NULL, to_date('20170520040000', 'yyyy-mm-dd hh24:mi:ss'), 'trunc(sysdate+1)+4/24');
job_id:
执行完后,不要忘记提交事务。
如果需要失效job,可以执行以下语句:exec DBMS_JOB.remove(412);
切记,不要忘记提交事务。
当然oracle的定时机制不止这一种,我目前知道且接触到的仅有job,以后再遇到别的,我会继续补充