存儲過程查詢遍歷行數據並判斷計算處理

存儲過程查詢遍歷行數據並判斷計算處理,業務處理可忽略,主要運用

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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章