当前位置: 代码迷 >> Oracle开发 >> 怎么在job的执行过程中修改job自身的下次执行时间
  详细解决方案

怎么在job的执行过程中修改job自身的下次执行时间

热度:86   发布时间:2016-04-24 06:30:15.0
如何在job的执行过程中修改job自身的下次执行时间?
用job调一个存储过程,要根据存储过程的执行时间,修改job的下次执行时间。

一开始我是把dbms_job.next_date()写在调用的存储过程里。但是发现写在这里没用,因为job执行完之后它会再修改自己的下次执行时间。

后来因为存储过程执行到最后的时候会update一张表,我就写了一个update触发器,把dbms_job.next_date()写在触发器里。但搜资料发现触发器和触发它的语句是在同一个事务里,所以说dbms_job.next_date()还是在job的执行过程中,改了没用。

特来此请教各位大神,这个问题该怎么解决呢?
------解决思路----------------------
在第一个job里加一个判断,如果时间相等,再执行你的过程,不相等,就退出。比如,你设定作业每天执行1次,但我只要每月的5,15,25日执行作业,可以如下:
if to_char(sysdate,'dd') in ('05','15','25') then
   。。。--执行过程
end if;
------解决思路----------------------
在一个表中配置两个字段,一个保存上次job启动的时刻,一个上次job执行完毕的时刻。
job每次启动时,判断当前时间sysdate减去上次job执行完毕的时刻,根据这个时间差来决定是执行过程还是跳到过程结尾。
如果是决定执行,那么执行过程前后修改那两个字段值就可以。
用一定的算法去控制两个时间标记就可以达到你的目的。
------解决思路----------------------
引用:
Quote: 引用:

在第一个job里加一个判断,如果时间相等,再执行你的过程,不相等,就退出。比如,你设定作业每天执行1次,但我只要每月的5,15,25日执行作业,可以如下:
if to_char(sysdate,'dd') in ('05','15','25') then
   。。。--执行过程
end if;
问题就在于job的下次执行时间是不定的,是根据执行存储过程所用的时间来修改的

3楼说法你没理解

打个比方吧,比如公司给你发工资是这样一个机制,每次发工资时告诉你下次发工资的时间,但是你总记不住下次发工资的时间,所以你每天一上班就去问是不是今天发工资,直到下次该发工资时才会执行发工资的动作

你所需要做的就是让你的任务每天都执行,然后在你的任务过程的最开始加一个验证,判断是不是今天需要执行,不需要则直接退出,需要则执行,这样不需要执行的时候只是多了一次验证,不会太影响数据库的效率的
------解决思路----------------------
引用:
Quote: 引用:

在一个表中配置两个字段,一个保存上次job启动的时刻,一个上次job执行完毕的时刻。
job每次启动时,判断当前时间sysdate减去上次job执行完毕的时刻,根据这个时间差来决定是执行过程还是跳到过程结尾。
如果是决定执行,那么执行过程前后修改那两个字段值就可以。
用一定的算法去控制两个时间标记就可以达到你的目的。
可不可以不在job里判断,而是直接修改job的下次执行时间。因为像你这样说的改的话,job还是在不该执行的时间执行了,只是没有执行存储过程。而我项目的业务逻辑里还有一些涉及到job的逻辑,这样改改动大。

你的想法是根据每次job执行的情况,去修改job作业本身的参数。没这样做过,一般都是在job里面控制的。
------解决思路----------------------
可以尝试在job的存储过程中删除自身的job,然后根据下次执行的时间重新创建job
不确定是否可以,没试过,可以尝试下
------解决思路----------------------
引用:
可以尝试在job的存储过程中删除自身的job,然后根据下次执行的时间重新创建job
不确定是否可以,没试过,可以尝试下

嗯,job创建好后不能修改了吗?万一删除后,重建job时发生异常,那么整个流程就挂了,必须人工去干预。
------解决思路----------------------
还有一种思路,就是用另外的job每天执行同步操作,
每天查看当前的job下次执行时间和设置的下次执行时间是否一致,不一致则修改job的执行时间
------解决思路----------------------
在你的JOB 最后,动态 SQL 删除这个 job , 再动态 SQL 增加上这个 job .