job每小时执行一次 oracle_oracle job定时执行
oracle中準(zhǔn)確控制job的下次運行時間(next date)
用過ORACLE的JOB的朋友也許都能夠感覺到它的強(qiáng)大,和JAVA中的quartz有異曲同工之妙,可以少了很多的重復(fù)勞動;但是也會有許多問題,就是執(zhí)行時間段和執(zhí)行時間比較不容易確定。這其實都是我們還不熟悉JOB的interval造成的。
我碰到過幾種用JOB的情況,從簡到煩說三種:
1。最簡單的,一個隔一段時間執(zhí)行一次,沒有其它限制。
interval: sysdate+2 每隔2天執(zhí)行一次
sysdate+1/2 每隔12小時執(zhí)行一次
sysdate+3/1440 每隔 3 分鐘執(zhí)行一次
2。簡單的定時執(zhí)行。
interval: trunc(sysdate+1)+1/3 每天的8點運行
3。要定時間段執(zhí)行的。
interval: case when to_number(to_char(sysdate,'hh24'))>=8 and to_number(to_char(sysdate,'hh24'))<=20 then sysdate+15/1440 else trunc(sysdate+1)+1/3 end
每天的8點到20點之點,每隔15分鐘運行一次,其余的每天的早上8點運行。
case when to_number(to_char(sysdate,'mm'))>=6 and to_number(to_char(sysdate,'mm'))<=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機(jī)制,它的下次運行時間是在你的任務(wù)跑完以后才計算的。你的任務(wù)或多或少都會花些時間,這就導(dǎo)致下次運行時間不準(zhǔn)。 比如,第一次運行是在 8:00:00,任務(wù)運行時間 10秒,那么下次的運行時間就是變成了 8:15:10(因為當(dāng)時的sysdate+15/1440就是8:15:10),而不是希望的 8:15:00,這樣多跑幾次,就會造成很大的出入。
解決辦法還是用job的interval,它不僅支持象 3 這樣的sql語句,而且還支持函數(shù),這樣功能就強(qiáng)了。
寫一個函數(shù) 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>=20 then
result:=trunc(sysdate+1)+1/3;
else
v_n_all:=trunc(sysdate);
if v_n_min>=0 and v_n_min<15 then
result:=v_n_all+(v_n_hour*60+15)/1440;
elsif v_n_min>=15 and v_n_min<30 then
result:=v_n_all+(v_n_hour*60+30)/1440;
elsif v_n_min>=30 and v_n_min<45 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
總結(jié)
以上是生活随笔為你收集整理的job每小时执行一次 oracle_oracle job定时执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:intellij idea如何右键新
- 下一篇: 达芬奇密码025