存储过程事例

BEGIN
    -- 定义变量
    DECLARE s int DEFAULT 0;
    DECLARE isE tinyint(1) DEFAULT 0;
    DECLARE vehicleId char(32); -- 车辆id
    DECLARE num decimal(5,2); -- 加油数量 单位升
    DECLARE oilWear decimal(5,2); -- 百公里油耗
    DECLARE mileage decimal(8,2) DEFAULT(0); -- 区间内的公里数
    DECLARE beginTime datetime;    -- 上上次加油时间 
    DECLARE endTime datetime; -- 上次加油时间
    DECLARE addNum int DEFAULT 0; -- 添加条数
    -- 定义游标,并将sql结果集赋值到游标中
    DECLARE report CURSOR FOR select r.create_time as begin_time,r2.create_time as end_time,r.num,r.vehicle_id from mjm_refuel_record as r
        JOIN(
        select vehicle_id,create_time FROM mjm_refuel_record 
        where TO_DAYS(NOW( )) - to_days(create_time) =1
        GROUP BY vehicle_id
        ORDER BY create_time DESC
        ) as r2 on r.vehicle_id = r2.vehicle_id and r.create_time < r2.create_time
        GROUP BY r.vehicle_id
        ORDER BY r.create_time desc;
    -- 声明当游标遍历完后将标志变量置成某个值
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
    -- 打开游标
    open report;
        -- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
        fetch report into beginTime,endTime,num,vehicleId;
        -- 当s不等于1,也就是未遍历完时,会一直循环
        while s<>1 do
        -- 执行业务逻辑
            SELECT IFNULL(sum(today_mileage/10),0) into mileage from mjm_gps_record_collect WHERE vehicle_id = vehicleId and  update_time>= beginTime and update_time <=endTime; 
        -- 是否存在记录
            SELECT count(1) into isE from mjm_oil_wear_collect WHERE vehicle_id = vehicleId AND day = DATE(NOW());
            IF mileage>0 THEN
                set oilWear = num*(100/mileage);
                IF isE THEN
                    UPDATE mjm_oil_wear_collect SET oil_num = oilWear,oil_num = num,mileage = mileage,begin_time=beginTime,end_time=endTime WHERE vehicle_id = vehicleId AND day = DATE(NOW());
                ELSE
                    INSERT into mjm_oil_wear_collect(id,vehicle_id,day,oil_wear,oil_num,mileage,begin_time,end_time) VALUES(replace(UUID(),'-',''),vehicleId, DATE(NOW()),oilWear,num,mileage,beginTime,endTime);
                END IF;
                set addNum = addNum+1;
            END IF;
            -- 将游标中的值再赋值给变量,供下次循环使用
            fetch report into beginTime,endTime,num,vehicleId;
        -- 当s等于1时表明遍历以完成,退出循环
        end while;
    -- 关闭游标
    close report;
    RETURN addNum;
END

该事例为统计百公里车辆油耗做的存储过程,然后后台做定时任务。根据加油的时间范围获取车辆的里程,再根据里程与油耗算出上次的百公里油耗。

posted @ 2019-05-21 14:44  杨光哥哥  阅读(193)  评论(0编辑  收藏  举报