对于Oracle的定时job我不是很了解,最近碰到个问题,之前别人写的定时Job现在好像不执行了,然后我找了半天问题也没找到,故此过来请教一下大家。
说明一下,这个存储过程里面涉及到将一个数据来源dblink的视图表里的数据添加到另外一张表里,不知道定时任务不执行是不是跟此有关。
麻烦大家知道的帮我找找问题,谢啦!

解决方案 »

  1.   

    你单独手动执行一下,看看是不是报错了,连续报错16次,JOB会自动broken不执行了
      

  2.   


    逻辑应该也没啥为题,下面是定时任务要执行的存储过来(是放在包里的):
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    create or replace package body UP_SOA_GET is
      g_mess varchar2(1000);  --定时任务
      procedure p_clgl_job is
        /***********************************
        * 描述:定时任务  8:10 执行  同步车辆运行公里
        * 参数
        * 数据源:soa 八方达机务系统前置库 8点开始推送到前置库 5分钟之内
        * 目标库:八方达机务系统本地库
        * 步骤:1,取得同步日期
        *       2,同步数据
        ************************************/
        ret_out integer;
        v_riqi  varchar2(20);
      begin
        v_riqi := to_char(sysdate - 1, 'yyyy-mm-dd');
        p_clgl(v_riqi, ret_out);
      end;  --同步数据 车辆行驶公里 从soa同步 160203
      procedure p_clgl(in_riqi in varchar2, ret_out out integer) is
        /***********************************
        * 描述:同步数据 车辆行驶公里 从soa同步  160203
        * 参数
        *     in_riqi in varchar2  日期  yyyy-mm-dd
        *     iret_out out integer 返回值 1 成功 -1 失败  
        * 目标表:T_SOA_CLGLB
        * 原表  :v_soa_clglb
        * 步骤:1,删除数据
        *       2,插入数据
        *       3,更新公司id
        ************************************/
        v_date date;
      begin
        ret_out := 1;
        v_date  := to_date(in_riqi, 'yyyy-mm-dd');
      
        g_mess := '删除指定日期数据:' || in_riqi;
        delete from T_SOA_CLGLB where SJRQ = v_date;
      
        g_mess := '插入指定日期数据:' || in_riqi;
        insert into T_SOA_CLGLB
          (CKCZLCID, SJRQ, CKCLID, CLZBH, CKJGID, YYLC, FYYLC, YXGL)
          select ckczlcid, sjrq, ckclid, clzbh, ckjgid, yylc, fyylc, YXGL
            from v_soa_clglb
           where sjrq = v_date;
      
        g_mess := '更新公司id:' || in_riqi;
        update T_SOA_CLGLB t
           set gsid = (select company_id
                          from t_core_vehicle v
                         where v.veh_code = t.clzbh
                           and V.veh_isdelete = 'F')
         where sjrq = v_date;
        commit;
      
      exception
        when others then
          rollback;
          ret_out := -1;
          g_mess  := g_mess || ',' || sqlerrm;
          P_SAVE_MESSAGE(g_mess, UP_MT_CONSTANT.C_PROC_NO, 'p_clgl',
                         UP_MT_CONSTANT.C_MT_MAIN);
          commit;
      end;end UP_SOA_GET;
    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑您看有问题吗?
    其中v_soa_clglb这个视图,就是我说的那个dblink数据来源的
      

  3.   

    P_SAVE_MESSAGE 这个是用来记录日志的吧?把成功的部分,也记录一下日志,看看是否执行过;
      

  4.   


    恩,我给T_SOA_CLGLB加了个触发器,只要删除、新增或修改都会往一个日志表里加日志,但是当定时任务执行时,这个日志表里没有日志信息,说明这三个操作一个都没有执行。
      

  5.   

    你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你job问题。先确认哪个问题
      

  6.   


    手工是可以的,那就是job问题了,可是job什么问题呢
      

  7.   


    手工是可以的,那就是job问题了,可是job什么问题呢
    手工是可以的,那就是job问题了,可是job什么问题呢看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少
      

  8.   

    看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少我执行了一下,是10
      

  9.   


    手工是可以的,那就是job问题了,可是job什么问题呢
    手工是可以的,那就是job问题了,可是job什么问题呢看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少==============================================================================================
    我执行了一下,是10,这个数 有问题吗?
      

  10.   


    手工是可以的,那就是job问题了,可是job什么问题呢
    手工是可以的,那就是job问题了,可是job什么问题呢看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少==============================================================================================
    我执行了一下,是10,这个数 有问题吗?
    改大点,改成100,如果job数量超过10,第11个就不会执行了alter system set job_queue_processes =100;
      

  11.   


    手工是可以的,那就是job问题了,可是job什么问题呢
    手工是可以的,那就是job问题了,可是job什么问题呢看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少==============================================================================================
    我执行了一下,是10,这个数 有问题吗?
    改大点,改成100,如果job数量超过10,第11个就不会执行了alter system set job_queue_processes =100;==============================================================
    噢,那我改一下再试试吧,O(∩_∩)O谢谢啦,麻烦你这么久
      

  12.   


    手工是可以的,那就是job问题了,可是job什么问题呢
    手工是可以的,那就是job问题了,可是job什么问题呢看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少==============================================================================================
    我执行了一下,是10,这个数 有问题吗?

    改大点,改成100,如果job数量超过10,第11个就不会执行了alter system set job_queue_processes =100;==============================================================================================
    还是不行,我倒是没把job_queue_processes改成100,我改的是30,
    因为我这select count(1) from dba_jobs是19,然后就没改那么大
    结果还是不行。
    我在实际要执行的sql上自己又新加了个slq充当日志,
    结果日志有,但是想让它执行的操作没有实现