oracle中定时任务job

oracle中的job能为你做的就是:在你规定的时间格式里定时执行存储过程,定时执行一个任务

–创建job及运行:

variable job2010 number;
begin
dbms_job.submit(:job2010,'spgenchanneluseroneday;',sysdate,'sysdate+1/24');
end;
/
begin
dbms_job.run(:job2010);
end;
/
commit;

–重启job(可以用上面那个方式也可以直接启动)
select * from user_jobs b where b.WHAT like ‘%5secdelete%’; 根据存储过程名字 找出job(数字)

begin
dbms_job.run(356);
end;
/
commit;

–停掉job

exec dbms_job.broken(job.id,true);
exec dbms_job.remove(job.id);
commit;

当用exec时需要在命令行窗口执行;当用begin XXX end;这种可以在sql窗口执行,实际效果是一样的

—修改job间隔时间

begin
  dbms_job.interval('438','trunc(sysdate,''Mi'')+1/24');  /*job  job的ID,interval: 计算下一次任务执行的时间表达式*/
  commit;
end;

这些的执行方式同上面,就不再一一概述了:
删除job:dbms_job.remove(jobno);
修改job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms_job.broken(job.id,true);
启动job:dbms_job.run(jobno);

job中的小问题(以下部分参考https://blog.csdn.net/cqu63737/article/details/100236969):
有些人问,Oracle的JOB在设定完next_date和interval之后,到底是什么时候决定下一次运行时间的。可以归纳成以下几个问题。

1. 假设我们的JOB设定第一次运行的时间是12:00,运行的间隔是1小时,JOB运行需要耗时30分钟,那么第二次运行是在13:00还是13:30?(13:00)

JOB在运行结束之后才会更新next_date,但是计算的方法是JOB刚开始的时间加上interval设定的间隔。
则第二次运行是在13:00。

2. 如果是在13:00那是不是说明只要JOB一开始运行,next_date就被重新计算了?

JOB在运行结束之后才会更新next_date。一般情况是:next_date=JOB刚开始的时间+interval设定的间隔,但是当执行时间大于设置的间隔的时候可能直接取当前时间

3. JOB的下一次运行会受到上一次运行时间的影响吗?如果受到影响,如何可以避免这个影响而让JOB在每天的指定时刻运行?

JOB的下一次运行时间是会受上一次影响的,如果我们的interval仅仅是sysdate+1/24这样的形式的话,无疑,上次执行的时间再加上1小时就是下次执行的时间。那么如果JOB因为某些原因延迟执行了一次,这样就会导致下一次的执行时间也同样顺延了,这通常不是我们希望出现的现象。

解决方法很简单,只需要设定正确的interval就可以了。

比如,我们要JOB在每天的凌晨3:30执行而不管上次执行到底是几点,只需要设置interval为trunc(SYSDATE)+3.5/24+1即可。

4. 假设我们的JOB设定第一次运行的时间是12:00,运行的间隔是30分钟,JOB运行需要耗时1小时,那么第二次运行是在12:30还是13:00还是根本就会报错?(13:00)

更新next_date字段的公式是greatest(:3,
sysdate),此处的:3绑定的是job的this_date+interval。所以我们猜测实际上应该是有一个跟当前时间的比较机制,如果在执行完JOB之后的时间比按照this_date+interval计算出的时间更晚一些,那么next_date就更新为当前时间,也就是几乎会立刻再重新执行JOB。

也就是说,next_date,如果JOB 开始时间+间隔时间 小于 当前时间,那么则取 当前时间,否则取 开始时间+间隔时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值