oracle中定时任务job

    技术2022-07-11  144

    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 开始时间+间隔时间 小于 当前时间,那么则取 当前时间,否则取 开始时间+间隔时间。

    Processed: 0.012, SQL: 9