您的位置:首页 > 数据库 > Oracle

oracle 存储过程 游标嵌套

2015-08-26 09:36 381 查看
这是一段将设备的GPS数据的工作小时数进行统计的存储过程,首先通过游标取出所有设备信息,然后对每一台设备进行工作小时数统计,其中用到了游标嵌套

CREATE OR REPLACE PROCEDURE CMTOOLS.proc_statistics_workhour IS
v_beginDate date;
v_endDate date;
v_recordCount number;
v_recordIndex number;
v_statistical_uuid char(36);
v_workhour number;
v_gpsDate date;
v_equipId char(36);

/*定义游标 取出所以安装GPS的设备*/
CURSOR c_equipRows IS SELECT EQUIP_ID FROM EQUIP_EQUIPMENT WHERE GPS_TYPE>0;
BEGIN
SELECT COUNT(*) INTO v_recordCount FROM GPS_STATISTICAL_DATE;
IF v_recordCount>0 THEN
BEGIN
SELECT MAX(STATISTICAL_DATE)+1 INTO v_beginDate FROM GPS_STATISTICAL_DATE;
END;
ELSE
BEGIN
SELECT MIN(GPS_DATE) INTO v_beginDate FROM GPS_MONITOR_DATA;
END;
END IF;

v_beginDate := to_date(to_char(v_beginDate,'yyyy-mm-dd') || ' 00:00:00','yyyy-mm-dd hh24:mi:ss');

WHILE v_beginDate < sysdate-1 LOOP
BEGIN
v_endDate := to_date(to_char(v_beginDate,'yyyy-mm-dd') || ' 23:59:59','yyyy-mm-dd hh24:mi:ss');
BEGIN
SELECT get_uuid() INTO v_statistical_uuid FROM dual;
INSERT INTO GPS_STATISTICAL_DATE VALUES(v_statistical_uuid,to_date(to_char(v_beginDate,'yyyy-mm-dd'),'yyyy-mm-dd'));
FOR equipRow IN c_equipRows LOOP
BEGIN
v_equipId := equipRow.equip_id;
v_recordIndex:=1;
v_workhour:=0;
FOR gpsRow IN (SELECT * FROM TABLE(FUN_WORKHOUR_DT(v_equipId,v_beginDate,v_endDate))) LOOP
BEGIN
IF v_recordIndex mod 2 = 0 THEN
BEGIN
v_workhour := v_workhour + ROUND((gpsRow.GPS_DATE-v_gpsDate)*24,2);
END;
END IF;
v_recordIndex := v_recordIndex+1;
v_gpsDate := gpsRow.GPS_DATE;
END;
END LOOP;
INSERT INTO GPS_STATISTICAL_WORKHOUR VALUES(get_uuid(),v_statistical_uuid,equipRow.equip_id,v_workhour);
END;
END LOOP;
END;
v_beginDate := v_beginDate+1;
END;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END proc_statistics_workhour;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: