Oracle定时job没有按时执行里面的存储过程,是怎么回事呢?

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

18 个解决方案

#1


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

#2


引用 1 楼 sxq129601 的回复:
你单独手动执行一下,看看是不是报错了,连续报错16次,JOB会自动broken不执行了

应该是执行成功了,您看一下截图
Oracle定时job没有按时执行里面的存储过程,是怎么回事呢?

#3


应该是执行了,让他们检查一下逻辑;

#4


引用 3 楼 wmxcn2000 的回复:
应该是执行了,让他们检查一下逻辑;


逻辑应该也没啥为题,下面是定时任务要执行的存储过来(是放在包里的):
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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数据来源的




#5


P_SAVE_MESSAGE 这个是用来记录日志的吧?

把成功的部分,也记录一下日志,看看是否执行过;

#6


引用 5 楼 wmxcn2000 的回复:
P_SAVE_MESSAGE 这个是用来记录日志的吧?

把成功的部分,也记录一下日志,看看是否执行过;


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

#7


怎么回事呢?

#8


Oracle定时job没有按时执行里面的存储过程,是怎么回事呢?肿么办呢???

#9


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

#10


引用 9 楼 sxq129601 的回复:
你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你job问题。先确认哪个问题


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

#11


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少

#12


我执行了一下是10

#13


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少

我执行了一下,是10

#14


引用 11 楼 sxq129601 的回复:
Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少


==============================================================================================
我执行了一下,是10,这个数 有问题吗?









#15


引用 14 楼 baidu_35093115 的回复:
Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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;

#16


引用 15 楼 sxq129601 的回复:
Quote: 引用 14 楼 baidu_35093115 的回复:

Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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谢谢啦,麻烦你这么久


#17


引用 15 楼 sxq129601 的回复:
Quote: 引用 14 楼 baidu_35093115 的回复:

Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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充当日志,
结果日志有,但是想让它执行的操作没有实现












#18


我也遇到同样的问题,你解决了吗?

#1


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

#2


引用 1 楼 sxq129601 的回复:
你单独手动执行一下,看看是不是报错了,连续报错16次,JOB会自动broken不执行了

应该是执行成功了,您看一下截图
Oracle定时job没有按时执行里面的存储过程,是怎么回事呢?

#3


应该是执行了,让他们检查一下逻辑;

#4


引用 3 楼 wmxcn2000 的回复:
应该是执行了,让他们检查一下逻辑;


逻辑应该也没啥为题,下面是定时任务要执行的存储过来(是放在包里的):
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
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数据来源的




#5


P_SAVE_MESSAGE 这个是用来记录日志的吧?

把成功的部分,也记录一下日志,看看是否执行过;

#6


引用 5 楼 wmxcn2000 的回复:
P_SAVE_MESSAGE 这个是用来记录日志的吧?

把成功的部分,也记录一下日志,看看是否执行过;


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

#7


怎么回事呢?

#8


Oracle定时job没有按时执行里面的存储过程,是怎么回事呢?肿么办呢???

#9


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

#10


引用 9 楼 sxq129601 的回复:
你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你job问题。先确认哪个问题


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

#11


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少

#12


我执行了一下是10

#13


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少

我执行了一下,是10

#14


引用 11 楼 sxq129601 的回复:
Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

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


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


看看select value from v$parameter where name like '%job_queue_processes%'  ,的值是多少


==============================================================================================
我执行了一下,是10,这个数 有问题吗?









#15


引用 14 楼 baidu_35093115 的回复:
Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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;

#16


引用 15 楼 sxq129601 的回复:
Quote: 引用 14 楼 baidu_35093115 的回复:

Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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谢谢啦,麻烦你这么久


#17


引用 15 楼 sxq129601 的回复:
Quote: 引用 14 楼 baidu_35093115 的回复:

Quote: 引用 11 楼 sxq129601 的回复:

Quote: 引用 10 楼 baidu_35093115 的回复:

Quote: 引用 9 楼 sxq129601 的回复:

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


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


引用 10 楼 baidu_35093115 的回复:
Quote: 引用 9 楼 sxq129601 的回复:

你看看你手工执行,数据有添加吗,如果没有就是过程问题,如果有数据添加就是你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充当日志,
结果日志有,但是想让它执行的操作没有实现












#18


我也遇到同样的问题,你解决了吗?