存储过程查询遍历行数据并判断计算处理

存储过程查询遍历行数据并判断计算处理,业务处理可忽略,主要运用

declare cursor……
open all_data……
loop fetch all_data into row_data……

创建定义游标以及循环逐行取数等方式。

CREATE OR REPLACE PROCEDURE P_GET_TASKNUM(V_GROUPID in VARCHAR2,
                                          --V_GROUPTYPE   in VARCHAR2,
                                          V_PROCESSID   in VARCHAR2,
                                          V_TASKGROUPID in VARCHAR2,
                                          V_ALLTASKNUM  out INTEGER, --所有的任务
                                          V_VALTASKNUM  out INTEGER, --开启的任务
                                          V_RUNTASKNUM  out INTEGER, --持续调度中的任务
                                          V_ERRTASKNUM  out INTEGER, --错误任务
                                          V_OVTTASKNUM  out INTEGER --超时任务
                                          ) AS
  --该存储过程只返回具体任务数数据 不反回查询的游标
  V_TEMP  INTEGER := 0;
  V_TEMP2 INTEGER := 0;
  V_TEMP3 INTEGER := 0;
  V_TEMP4 VARCHAR2(20) := '';
begin
  select count(1)
    INTO V_TEMP
    from (select j.id,
                 j.job_group,
                 j.taskgroup,
                 s.processid,
                 j.is_execute,
                 j.invaldate,
                 j.invaltime,
                 j.overtime
            from KDGS_QRTZ_TRIGGER_INFO j, KDGS.KDGS_DBGATE_TASK s
           WHERE j.id = s.job_id(+)) r
   where (r.job_group = V_GROUPID or V_GROUPID = 0)
     and (r.taskgroup = V_TASKGROUPID or V_TASKGROUPID = 0)
     and (r.processid = V_PROCESSID or V_PROCESSID = 0);
  V_ALLTASKNUM := V_TEMP;
  select count(1)
    INTO V_TEMP
    from (select j.id,
                 j.job_group,
                 j.taskgroup,
                 s.processid,
                 j.is_execute,
                 j.invaldate,
                 j.invaltime,
                 j.overtime
            from KDGS_QRTZ_TRIGGER_INFO j, KDGS.KDGS_DBGATE_TASK s
           WHERE j.id = s.job_id(+)) r
   where (r.job_group = V_GROUPID or V_GROUPID = 0)
     and (r.taskgroup = V_TASKGROUPID or V_TASKGROUPID = 0)
     and (r.processid = V_PROCESSID or V_PROCESSID = 0)
     and r.is_execute = 0;
  V_VALTASKNUM := V_TEMP;
  select count(1)
    INTO V_TEMP
    from (select j.id,
                 j.job_group,
                 j.taskgroup,
                 s.processid,
                 j.is_execute,
                 j.invaldate,
                 j.invaltime,
                 j.overtime,
                 j.starttime,
                 j.endtime
            from KDGS_QRTZ_TRIGGER_INFO j, KDGS.KDGS_DBGATE_TASK s
           WHERE j.id = s.job_id(+)) r
   where (r.job_group = V_GROUPID or V_GROUPID = 0)
     and (r.taskgroup = V_TASKGROUPID or V_TASKGROUPID = 0)
     and (r.processid = V_PROCESSID or V_PROCESSID = 0)
     and r.is_execute = 0
     and to_date(r.endtime, 'hh24:mi:ss') >
         to_date(to_char(sysdate, 'hh24:mi:ss'), 'hh24:mi:ss')
     and to_date(to_char(sysdate, 'hh24:mi:ss'), 'hh24:mi:ss') >
         to_date(r.starttime, 'hh24:mi:ss');
  V_RUNTASKNUM := V_TEMP;

  --开始查询错误任务超时任务数据对象
  V_TEMP := 0;
  declare
    cursor all_data is
      select x.*,
             m.currentstatus,
             m.currentstep,
             m.isignore,
             m.triggertime,
             m.finishtime
        from (select r.*
                from (select j.id,
                             j.job_group,
                             j.taskgroup,
                             s.processid,
                             j.is_execute,
                             j.starttime,
                             j.endtime,
                             j.deadline,
                             j.overtime
                        from KDGS_QRTZ_TRIGGER_INFO j,
                             KDGS.KDGS_DBGATE_TASK  s
                       WHERE j.id = s.job_id(+)) r
               where (r.job_group = V_GROUPID or V_GROUPID = 0)
                 and (r.taskgroup = V_TASKGROUPID or V_TASKGROUPID = 0)
                 and (r.processid = V_PROCESSID or V_PROCESSID = 0)) x,
             (select *
                from KDGS_MONITOR
               where kddate = to_char(sysdate, 'YYYYMMDD')) m
       where x.id = m.jobid(+);
    row_data all_data%ROWTYPE;
  begin
    open all_data;
    loop
      fetch all_data
        into row_data;
      exit when all_data%notfound;
   
      --失败任务加1 根据KDGS_MONITOR状态判断
      V_TEMP3 := row_data.currentstatus;
      V_TEMP4 := row_data.deadline;
      if row_data.is_execute = 0 and V_TEMP3 = 2 then
        V_TEMP2 := V_TEMP2 + 1;
      end if;
   
      --文件任务失败任务加1 如果KDGS_MONITOR无状态或状态非成功,并且超过运行时间限定
      if row_data.is_execute = 0 and V_TEMP4 is not null and (V_TEMP3 is null or V_TEMP3 <> 1) and
         to_date(to_char(sysdate, 'hh24:mi:ss'), 'hh24:mi:ss') >
         to_date(V_TEMP4, 'hh24:mi:ss') then
        V_TEMP2 := V_TEMP2 + 1;
      end if;
      --超时任务加1
      if row_data.overtime > 0 and
         (row_data.overtime * 1000) <
         (row_data.finishtime - row_data.triggertime) then
        V_TEMP := V_TEMP + 1;
      end if;
   
    end loop;
    close all_data;
  end;
  V_ERRTASKNUM := V_TEMP2;
  V_OVTTASKNUM := V_TEMP;
end P_GET_TASKNUM;

猜你喜欢

转载自blog.csdn.net/u010760374/article/details/81114783