oracle 存储过程 游标嵌套

这是一段将设备的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;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值