我想过一种方法,就是在job的执行过程最后创建另一个job,等第一个job执行完之后,第二个job修改第一个job的时间。但第二个job怎么自身删除呢?

解决方案 »

  1.   

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

  2.   

    问题就在于job的下次执行时间是不定的,是根据执行存储过程所用的时间来修改的
      

  3.   

    在一个表中配置两个字段,一个保存上次job启动的时刻,一个上次job执行完毕的时刻。
    job每次启动时,判断当前时间sysdate减去上次job执行完毕的时刻,根据这个时间差来决定是执行过程还是跳到过程结尾。
    如果是决定执行,那么执行过程前后修改那两个字段值就可以。
    用一定的算法去控制两个时间标记就可以达到你的目的。
      

  4.   

    可不可以不在job里判断,而是直接修改job的下次执行时间。因为像你这样说的改的话,job还是在不该执行的时间执行了,只是没有执行存储过程。而我项目的业务逻辑里还有一些涉及到job的逻辑,这样改改动大。
      

  5.   

    3楼说法你没理解打个比方吧,比如公司给你发工资是这样一个机制,每次发工资时告诉你下次发工资的时间,但是你总记不住下次发工资的时间,所以你每天一上班就去问是不是今天发工资,直到下次该发工资时才会执行发工资的动作你所需要做的就是让你的任务每天都执行,然后在你的任务过程的最开始加一个验证,判断是不是今天需要执行,不需要则直接退出,需要则执行,这样不需要执行的时候只是多了一次验证,不会太影响数据库的效率的
    我是需要直接修改job的下次执行时间,就像帖子标题说的一样。如果是在job里加判断的话,job还是在不该执行的时间执行了,只是没有执行存储过程。而我项目的业务逻辑里还有一些涉及到job的逻辑,这样改改动大。
      

  6.   

    你的想法是根据每次job执行的情况,去修改job作业本身的参数。没这样做过,一般都是在job里面控制的。
      

  7.   

    你的想法是根据每次job执行的情况,去修改job作业本身的参数。没这样做过,一般都是在job里面控制的。是的,就是这个意思了
      

  8.   

    可以尝试在job的存储过程中删除自身的job,然后根据下次执行的时间重新创建job
    不确定是否可以,没试过,可以尝试下
      

  9.   

    嗯,job创建好后不能修改了吗?万一删除后,重建job时发生异常,那么整个流程就挂了,必须人工去干预。
      

  10.   

    有想过,但是想想好像不科学,就没试,所以想了2楼我说的方法。也存在同一个问题,job可以自身杀出吗?
      

  11.   

    嗯,job创建好后不能修改了吗?万一删除后,重建job时发生异常,那么整个流程就挂了,必须人工去干预。job是可以修改参数的,但是不能在它执行的时候修改,因为它的机制是执行完了之后自己根据开始时候设的间隔时间重设下次执行时间。所以执行中修改的会被它覆盖掉。
      

  12.   

    还有一种思路,就是用另外的job每天执行同步操作,
    每天查看当前的job下次执行时间和设置的下次执行时间是否一致,不一致则修改job的执行时间
      

  13.   

    在你的JOB 最后,动态 SQL 删除这个 job , 再动态 SQL 增加上这个 job .
      

  14.   

    嗯,job创建好后不能修改了吗?万一删除后,重建job时发生异常,那么整个流程就挂了,必须人工去干预。job是可以修改参数的,但是不能在它执行的时候修改,因为它的机制是执行完了之后自己根据开始时候设的间隔时间重设下次执行时间。所以执行中修改的会被它覆盖掉。
    创建一个独立的事务,在这个独立事务中修改作业参数。作业结束时去调一下这个独立事务。不知行不行
      

  15.   

    刚去查了下,貌似不行,job想要删除的话,必须先kill掉才能删除
      

  16.   

    谢谢大家回复,我现在想到一个相对较好的办法。
    先给大家说我一下我项目的业务逻辑,项目的业务系统可以动态设置新增、修改job。所以job在数据库里是动态创建、多个的。然后每个job执行相应的存储过程,然后根据存储过程的执行时间更改这个动态job的下次执行时间。
    现在我想到的办法是,在数据库里手动创建一个固定job,间隔时间为null。那些每个动态的job执行的最后会更改这个固定的job的下次执行时间,就更改为动态job执行完之后延迟1分钟。而这个固定job就是在那些动态job执行完了之后1分钟更改动态job的下次执行时间。