MySQL存储过程实例——实现查询数据表,有则更新无则插入

来源:互联网 发布:人工智能的主要技术 编辑:程序博客网 时间:2024/05/27 20:16


delimiter //

CREATE PROCEDURE getMax_pro()
BEGIN 
DECLARE v_rtuid VARCHAR(11);
DECLARE v_datatime VARCHAR(30);
DECLARE v_ai1 VARCHAR(10);
DECLARE v_ai2 VARCHAR(10);
DECLARE v_ai3 VARCHAR(10);
DECLARE v_ai4 VARCHAR(10);
DECLARE v_ai5 VARCHAR(10);
DECLARE v_ai6 VARCHAR(10);
DECLARE v_ai7 VARCHAR(10);
DECLARE v_ai8 VARCHAR(10);
DECLARE v_di1 VARCHAR(10);
DECLARE v_di2 VARCHAR(10);
DECLARE v_di3 VARCHAR(10);
DECLARE v_di4 VARCHAR(10);
DECLARE v_di5 VARCHAR(10);
DECLARE v_di6 VARCHAR(10);
DECLARE v_di7 VARCHAR(10);
DECLARE v_di8 VARCHAR(10);


DECLARE done INT DEFAULT FALSE; -- 该语句要在光标的定义之前,不然报错
DECLARE cur CURSOR FOR select rtuid,DATE_FORMAT(datatime,'%Y-%m-%d'),MAX(ai1),MAX(ai2),MAX(ai3),MAX(ai4),MAX(ai5),MAX(ai6),MAX(ai7),
MAX(ai8),MAX(di1),MAX(di2),MAX(di3),MAX(di4),MAX(di5),MAX(di6),MAX(di7),MAX(di8) 
from tb_rtudata 
where datatime BETWEEN CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),' 00:00:00') AND NOW()
GROUP BY rtuid;-- 查询当天0点到当前时间的最大值
DECLARE CONTINUE HANDLER FOR NOT FOUND set done=TRUE; -- 该语句须在光标的定义之后,不然报错


OPEN cur;
read_loop:LOOP
FETCH cur INTO v_rtuid,v_datatime,v_ai1,v_ai2,v_ai3,v_ai4,v_ai5,v_ai6,v_ai7,v_ai8,v_di1,v_di2,v_di3,v_di4,v_di5,v_di6,v_di7,v_di8;
IF done THEN -- 遍历结束离开循环
leave read_loop;
END IF;
-- 业务: 实现有则更新,无则插入
IF EXISTS (select * from tb_rtudata_max where tb_rtudata_max.rtuid=v_rtuid and tb_rtudata_max.datatime=v_datatime) THEN
update tb_rtudata_max set tb_rtudata_max.ai1=v_ai1,tb_rtudata_max.ai2=v_ai2,tb_rtudata_max.ai3=v_ai3,tb_rtudata_max.ai4=v_ai4,
tb_rtudata_max.ai5=v_ai5,tb_rtudata_max.ai6=v_ai6,tb_rtudata_max.ai7=v_ai7,tb_rtudata_max.ai8=v_ai8,
tb_rtudata_max.di1=v_di1,tb_rtudata_max.di2=v_di2,tb_rtudata_max.di3=v_di3,tb_rtudata_max.di4=v_di4,
tb_rtudata_max.di5=v_di5,tb_rtudata_max.di6=v_di6,tb_rtudata_max.di7=v_di7,tb_rtudata_max.di8=v_di8
where tb_rtudata_max.rtuid=v_rtuid and tb_rtudata_max.datatime=v_datatime;
ELSE
insert INTO tb_rtudata_max(rtuid,datatime,ai1,ai2,ai3,ai4,ai5,ai6,ai7,ai8,di1,di2,di3,di4,di5,di6,di7,di8) 
VALUES(v_rtuid,v_datatime,v_ai1,v_ai2,v_ai3,v_ai4,v_ai5,v_ai6,v_ai7,v_ai8,v_di1,v_di2,v_di3,v_di4,v_di5,v_di6,v_di7,v_di8);
end if;
end LOOP;
-- select * from tb_rtudata_max;
END;
//

CALL getMax_pro();-- 调用


阅读全文
0 0