存储过程查询遍历行数据并判断计算处理,业务处理可忽略,主要运用
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;