转载自https://blog.csdn.net/starinbrook/article/details/77078126
转载自https://blog.csdn.net/makang456/article/details/53896346/
【简介】
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
游标充当指针的作用。
尽管游标能遍历结果中的所有行,但他一次只指向一行。
游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
【用法】
一、声明一个游标: declare 游标名称 CURSOR for table;(这里的table可以是你查询出来的任意集合)
二、打开定义的游标:open 游标名称;
三、获得下一行数据:FETCH 游标名称 into testrangeid,versionid;
四、需要执行的语句(增删改查):这里视具体情况而定
五、释放游标:CLOSE 游标名称;
注:mysql存储过程每一句后面必须用;结尾,使用的临时字段需要在定义游标之前进行声明。
【实例说明】
有两个表stu_info、stu_info_bak,表结构完全一致,建表脚本如下:
CREATE TABLE `stu_info` (
`stuId` varchar(20) NOT NULL COMMENT '学号',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手机号码',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份证号码',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息';
CREATE TABLE `stu_info_bak` (
`stuId` varchar(20) NOT NULL COMMENT '学号',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手机号码',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份证号码',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息备份';
stu_info表中有几条数据,stu_info_bak中没有数据,现在想要把stu_info中的数据全部备份到stu_info_bak表中。
【处理脚本】
delimiter $$
drop procedure if exists `proc_copy_stu_info` $$
CREATE PROCEDURE `proc_copy_stu_info`()
BEGIN
##定义变量
DECLARE done INT DEFAULT FALSE;
DECLARE v_stuId VARCHAR(20);
DECLARE v_stuName VARCHAR(20);
DECLARE v_phone VARCHAR(11);
DECLARE v_idNumber VARCHAR(20);
##创建游标,并存储数据
DECLARE cur CURSOR FOR SELECT stuId,stuName,phone,idNumber FROM stu_info;
##游标中的内容执行完后将done设置为true
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
##打开游标
OPEN cur;
##执行循环
read_loop : LOOP
##取游标中的值
FETCH cur INTO v_stuId,v_stuName,v_phone,v_idNumber;
##判断是否结束循环,一定要放到FETCH之后,因为在fetch不到的时候才会设置done为true
##如果放到fetch之前,先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次
IF done THEN
LEAVE read_loop;
END IF;
## 执行SQL操作
SET @sql_insert = CONCAT("insert into stu_info_bak(stuId,stuName,phone,idNumber) VALUES ('",v_stuId,"','",v_stuName,"','",v_phone,"','",v_idNumber,"')");
PREPARE sqlli FROM @sql_insert;
EXECUTE sqlli;
COMMIT;
END LOOP read_loop;
##释放游标
CLOSE cur;
END
$$
delimiter;
call `proc_copy_stu_info`();
commit;