完整例子贴出来:
CREATE DEFINER=`root`@`%` PROCEDURE `你的存储过程名称`() BEGIN
#创建临时表,并且读取数据表数据直接插入到临时表里,省去了创建临时表,声明字段步骤了。 CREATE TEMPORARY TABLE IF NOT EXISTS `你的临时表名` SELECT column1,column2,,,, FROM `你的数据表名`; BEGIN
#根据你的业务逻辑,声明你需要的一些变量
DECLARE startTime DATETIME DEFAULT NOW();#etc DECLARE endTime DATETIME DEFAULT NOW();#etc
DECLARE c_column1 varchar(50);
DECLARE c_column2 varchar(100);
#重点来了。 DECLARE done INT DEFAULT 0;#定义一个标志,自己约定一个condition 条件,满足条件 跳出循环,
#定义游标
#游标(Cursor)是用于查看或者处理结果集中的数据的一种方法。游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
DECLARE cr CURSOR for SELECT column1,column2 FROM `你的临时表名`;#循环临时表数据,
# CONTINUE HANDLER FOR NOT FOUND 的解释参考 DECLARE CONTINUE HANDLER FOR NOT found SET done = 1;#意思就是游标读取到结果集最后没有数据了 ,可以自己定义处理方式, 这里就是把上面定义的标志 done 变量 设置为 1 代表没有数据了 OPEN cr; myLoop:LOOP
FETCH cr INTO c_column,c_column2; #这句很重要:读取游标中的数据(每次遍历临时表中的数据得来了) 赋值给声明的你需要的变量 IF done = 1 THEN #当自定义的标志 变量 done 为 1 满足 条件 即代表没有数据了 就跳出循环了, 相当于 for循环中的 break; LEAVE myLoop; END IF; #逻辑START #在这里你可以写自己的业务sql, 操作变量的值 c_column1 c_column2 #逻辑ENDEND LOOP myLoop; -- 关闭游标 close cr; End; DROP TEMPORARY TABLE IF EXISTS `你的临时表`; End
保持学习,保持记录~