1.首先需要注意的是mysql中游標必須要建立在儲存過程中
2.直接上sql
-- 查詢當天資料
select in_flow+out_flow
from water_meter_data
where 1=1 and date(sys_read_time) = curdate()-1
order by (in_flow+out_flow) desc
limit 0,1
-- 查詢前一天資料
select in_flow+out_flow
from water_meter_data
where 1=1 and date(sys_read_time) = curdate()
order by (in_flow+out_flow) desc
limit 0,1
-- 查詢當天資料
select max(in_flow+out_flow)
from water_meter_data
where 1=1 and date(sys_read_time) = curdate()
-- 游標 + 儲存過程
-- 例子
drop procedure if exists usecursor;
delimiter
create procedure usecursor()
begin
declare oneaddr varchar(150) default '';
declare alladdr varchar(150) default '';
declare done int default 0;
declare curl cursor for select addr from energy.person;
declare continue handler for not found set done = 1;
open curl;
repeat
fetch curl into oneaddr;
if not done then
set oneaddr = concat(oneaddr, ';');
set alladdr = concat(alladdr, oneaddr);
end if;
until done end repeat;
close curl;
select alladdr;
end;
call usecursor();
-- 我的
-- 定義游標
drop procedure if exists water_total;-- 檢查儲存過程是否存在
delimiter; -- 分隔符
create procedure energy.water_total()-- 建立儲存過程
begin
-- 區域性變數的定義 declare
declare meter_id int default 0;-- 裝置id
declare flow_now int default 0;-- 當天的流量
declare flow_before int default 0;-- 前一天的流量
declare build_id int default 0;-- 建築id
declare room_id int default 0;-- 房間id
declare done int default 0; -- 控制游標結束
declare cur_meter cursor for
select energy.meter_info.hid ,energy.meter_info.buildid,energy.meter_info.consumer_id
from energy.meter_info where energy.meter_info.meter_type='5';-- 宣告游標
declare continue handler for not found set done = 1;-- 控制游標的結束
-- declare continue handler for sqlstate '02000' set done = 1;-- 這把 游標 異常後 捕捉 並設定 迴圈使用 變數 id 為 null 跳出迴圈
open cur_meter;-- 開啟游標
repeat -- repeat迴圈
fetch cur_meter into meter_id,build_id,room_id;-- 把第一行記錄寫入變數裡,游標也隨著指向第一行
-- select meter_id;
if not done then -- 判斷迴圈是否結束
-- 取當天的流量和最大值
select max(energy.water_meter_data.in_flow+energy.water_meter_data.out_flow) into flow_now
from energy.water_meter_data
where 1=1 and date(energy.water_meter_data.sys_read_time) = curdate() and energy.water_meter_data.meter_id = meter_id;
-- 取昨天的流量和最大值
select max(energy.water_meter_data.in_flow+energy.water_meter_data.out_flow) into flow_before
from energy.water_meter_data
where 1=1 and date(energy.water_meter_data.sys_read_time) = curdate()-1 and energy.water_meter_data.meter_id = meter_id;
-- 判斷是否為空
if (flow_now is not null) and (flow_before is not null) then
-- 插入到水表統計表中
insert into energy.water_data_total(energy.water_data_total.meter_id,energy.water_data_total.build_id,
energy.water_data_total.room_id,energy.water_data_total.water_flow,
energy.water_data_total.create_date,energy.water_data_total.create_user)
values(meter_id,build_id,room_id,flow_now-flow_before,date(now()),'admin');
end if;
end if;
until done end repeat; -- repeat迴圈結束
close cur_meter;-- 注意,用完後必須關閉
end;
-- 呼叫儲存過程
call energy.water_total();
MySQL 儲存過程 游標
儲存過程 本儲存過程有特殊執行迴圈數量的要求,是對security market history表進行修正 判斷儲存過程是否存在 drop procedure if exists proc security market history update create procedure proc se...
mysql 儲存過程 游標
宣告游標 declare cursor name cursor for select statement 這個語句宣告乙個游標。也可以在子程式中定義多個游標,但是乙個塊中的每乙個游標必須有唯一的名字。開啟游標 open cursor name 這個語句開啟先前宣告的游標。游標fetch fetch ...
MySQL 游標和儲存過程
我們有時候會遇到需要對 從a表查詢的結果集s s 的記錄 進行遍歷並做一些操作 如插入 且這些操作需要的資料或許部分來自s s集合 臨時儲存過程,沒辦法,不能直接在查詢視窗做這些事。drop procedure ifexists proc tmp create procedure proc tmp ...