===========================================================
===========================================================
itpub论坛回复:让一个JOB每天执行俩次
作者: oldwain(http://oldwain.itpub.net)发表于: 2006.04.08 23:33
分类: Oracle
出处: http://oldwain.itpub.net/post/6/66763
---------------------------------------------------------------
怎么让一个JOB每天执行俩次?
如每天中午12:00,下午5:30执行
我的回答:
方法1:
job每半小时执行一次调用外层procedure, 由外层procedure判断时间决定是否执行原来的procedure.<<>
begin
dbms_job.submit(job => :job,
what => 'pshell;',
next_date => sysdate,
interval => 'sysdate+30/60/24';
commit;
end;
create procedure pshell as
begin
if to_char(sysdate, 'hh24:mi") > '12:00' and to_char(sysdate, 'hh24:mi") < '12:30' then
p;
end if;
if to_char(sysdate, 'hh24:mi") > '17:30' and to_char(sysdate, 'hh24:mi") < '18:00' then
p;
end if;
end;
方法2:
用复杂的表达式来实现, 比如给job指定interval:
begin
dbms_job.submit(job => :job,
what => 'p;',
next_date => sysdate,
interval => 'decode(sign(sysdate-trunc(sysdate,''DD'')-12/24),-1,trunc(sysdate,''DD'')+12/24,decode(sign(sysdate-trunc(sysdate,''DD'')-17/24),-1,trunc(sysdate,''DD'')+17.5/24,trunc(sysdate,''DD'')+1+12/24))');
commit;
end;
/
这样看上去是简便了, 可是太晦涩, 不容易维护。 dbms_job.submit(job => :job,
what => 'p;',
next_date => sysdate,
interval => 'decode(sign(sysdate-trunc(sysdate,''DD'')-12/24),-1,trunc(sysdate,''DD'')+12/24,decode(sign(sysdate-trunc(sysdate,''DD'')-17/24),-1,trunc(sysdate,''DD'')+17.5/24,trunc(sysdate,''DD'')+1+12/24))');
commit;
end;
/
另外,interval参数的最大长度似乎只有200个字符(?), 如果再复杂一点,恐怕就没办法用这种办法来实现。
方法1看似复杂, 但提供了极大的灵活性。推荐使用方法1。
Technorati Tags: oracle, itpub, job(需要引用, 请注明出处: http://oldwain.itpub.net)




