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
该事例为统计百千米车辆油耗作的存储过程,而后后台作定时任务。根据加油的时间范围获取车辆的里程,再根据里程与油耗算出上次的百千米油耗。sql