mysql 游标 示例

提示:mysql 游标必须要在在存储过程中才能使用,不能单独使用

数据表

CREATE TABLE `student_score` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `student_id` varchar(128) DEFAULT NULL,
  `student_course_name` varchar(128) DEFAULT NULL,
  `score` int DEFAULT NULL,
  `result` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `student_score` (`id`, `student_id`, `student_course_name`, `score`, `result`)
VALUES
	('1', '001', '语文', '95', NULL),
	('2', '002', '语文', '80', NULL),
	('3', '003', '语文', '59', NULL);

代码示例

-- 定义分隔符为 //
DELIMITER //

-- 创建存储过程
CREATE PROCEDURE set_student_result()
BEGIN
	-- 定义变量,提示:定义变量语句 需要放在 定义游标语句 之前
	declare var_score int;
	declare var_id varchar(128);

	-- 定义游标查询结束标识
	declare done int default false;
	-- 定义游标
	declare cur cursor for select student_id, score from student_score where score > 0;
	-- 当 fetch 游标未发现数据时,done 置为 TRUE
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

	-- 开启游标
	open cur;

	-- 游标遍历数据:填充学生成绩表 result 字段,当分数 score 小于 60 时候为不及格,大于等于 60 时为及格
	read_loop: loop
		fetch cur into var_id, var_score;
		
		if done then
			leave read_loop;
		end if;
		
		if var_score >= 60 then
			update student_score set result = '及格' where student_id = var_id;
		end if;
	
		if var_score < 60 then
			update student_score set result = '不及格' where student_id = var_id;
		end if;
		
	end loop;
	-- 关闭游标
	close cur;
-- 存储过程结束
END //

-- 恢复定义分隔符为 ;
DELIMITER ;

SHOW PROCEDURE STATUS;

CALL set_student_result();

DROP PROCEDURE IF EXISTS set_student_result;

 

posted @ 2024-11-07 10:54  lenbkan  阅读(129)  评论(0)    收藏  举报