job每小时执行一次 oracle_oracle job定时执行

oracle中准确控制job的下次运行时间(next date)

用过ORACLE的JOB的朋友也许都能够感觉到它的强大,和JAVA中的quartz有异曲同工之妙,可以少了很多的重复劳动;但是也会有许多问题,就是执行时间段和执行时间比较不容易确定。这其实都是我们还不熟悉JOB的interval造成的。

我碰到过几种用JOB的情况,从简到烦说三种:

1。最简单的,一个隔一段时间执行一次,没有其它限制。

interval: sysdate+2 每隔2天执行一次

sysdate+1/2 每隔12小时执行一次

sysdate+3/1440 每隔 3 分钟执行一次

2。简单的定时执行。

interval: trunc(sysdate+1)+1/3 每天的8点运行

3。要定时间段执行的。

interval: case when to_number(to_char(sysdate,'hh24'))&gt=8 and to_number(to_char(sysdate,'hh24'))&lt=20 then sysdate+15/1440 else trunc(sysdate+1)+1/3 end

每天的8点到20点之点,每隔15分钟运行一次,其余的每天的早上8点运行。

case when to_number(to_char(sysdate,'mm'))&gt=6 and to_number(to_char(sysdate,'mm'))&lt=10 then trunc(sysdate+30) else trunc(sysdate+1)+1/6 end

6-10月份,每隔30天的凌晨开始运行,其余月份每隔一天早上4点运行

4。最困难的,每次运行都要求在指定时间

如3第一个,要求不仅是在每天的8点到20点之点,每隔15分钟运行一次,而且都要在0分,15分,30分,45分运行。

困难在ORACLE的JOB机制,它的下次运行时间是在你的任务跑完以后才计算的。你的任务或多或少都会花些时间,这就导致下次运行时间不准。 比如,第一次运行是在 8:00:00,任务运行时间 10秒,那么下次的运行时间就是变成了 8:15:10(因为当时的sysdate+15/1440就是8:15:10),而不是希望的 8:15:00,这样多跑几次,就会造成很大的出入。

解决办法还是用job的interval,它不仅支持象 3 这样的sql语句,而且还支持函数,这样功能就强了。

写一个函数 fn_get_myjob_interval

create or replace function fn_get_myjob_interval(now date) return date is

Result date;

v_n_min number;

v_n_hour number;

v_n_all date;

begin

v_n_min:= to_number(to_char(now,'mi'));

v_n_hour:=to_number(to_char(now,'hh24'));

if v_n_hour&gt=20 then

result:=trunc(sysdate+1)+1/3;

else

v_n_all:=trunc(sysdate);

if v_n_min&gt=0 and v_n_min&lt15 then

result:=v_n_all+(v_n_hour*60+15)/1440;

elsif v_n_min&gt=15 and v_n_min&lt30 then

result:=v_n_all+(v_n_hour*60+30)/1440;

elsif v_n_min&gt=30 and v_n_min&lt45 then

result:=v_n_all+(v_n_hour*60+45)/1440;

else

result:=v_n_all+(v_n_hour+1)*60/1440;

end if;

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值