体会循环,使用存储过程做1 ~ 100的累加和
create PROCEDURE p4(in count int, out result_sum int)
BEGIN
declare i int DEFAULT 0; -- 使用declare声明一个变量i,默认值是0
DECLARE sum int;
set sum = 0; -- 使用set设置sum这个变量的值为0
while i <= count DO
set sum = sum + i;
set i = i + 1;
end WHILE;
set result_sum = sum; -- 设置result_sum = sum
END
call p4(100, @he);
select @he;
show PROCEDURE status; -- 查看当前创建的存储过程
drop PROCEDURE p4; -- 删除p4存储过程
这是统计库表的数量与前5条时间的存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `p4`(in tablename VARCHAR(2000), out result_sum VARCHAR(2000), out otime VARCHAR(20000))
BEGIN
declare v_sql varchar(500);
declare v_sql1 varchar(500);
declare stopflag int default 0;
declare my_uname varchar(3200) default '';
declare time varchar(20000) default '';
declare my_uname1 varchar(3200) default '';
declare uname_cur CURSOR for SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME =tablename;
#1 游标是保存查询结果的临时内存区域
#2 游标变量uname_cur保存了查询的临时结果,实际上就是查询结果集
declare continue handler for not found set stopflag=1;
#3 声明句柄,当游标变量中保存的结果都查询一遍(遍历),到达结尾,就把变量stopflag设置为1 用于循环中判断是否遍历结束
open uname_cur; # 打开游标
fetch uname_cur into my_uname; # 游标向前走一步,取出一条记录放到变量my_uname中。
while(stopflag=0) DO # 如果游标还没到结尾,就继续循环
begin
fetch uname_cur into my_uname;
set v_sql1= CONCAT('SELECT COUNT(',my_uname,') into @count FROM ',tablename);
set @v_sql1=v_sql1;
prepare stmt1 from @v_sql1;
EXECUTE stmt1;
deallocate prepare stmt1;
IF @count =0 THEN
SET my_uname1=CONCAT(my_uname,",",my_uname1);
END IF;
IF my_uname='i_time' THEN
set v_sql= CONCAT('SELECT substring_index(GROUP_CONCAT(i_time),",","5") INTO @time1 FROM ' , tablename,' ORDER BY i_time DESC LIMIT 0,5 ');
set @v_sql=v_sql;
prepare stmt from @v_sql;
EXECUTE stmt;
deallocate prepare stmt;
END IF;
end;
end while;
close uname_cur;
set result_sum= my_uname1; -- 设置result_sum = sum
set otime= @time1;
END