在 MySQL 里,“游标(Cursor)”通常指在 存储过程 / 函数 / 触发器 中用来逐行遍历查询结果集的机制。普通 SQL 查询是直接返回结果集,而游标允许你在过程里一行一行处理数据。
下面从 基本用法 → 完整示例 → 注意事项 给你讲清楚。
在 MySQL 存储过程中,使用游标一般分 5 步:
DECLARE cursor_name CURSOR FOR select_statement;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cursor_name;
read_loop: LOOP
FETCH cursor_name INTO var1, var2;
IF done THEN
LEAVE read_loop;
END IF;
-- 处理每一行数据
END LOOP;
CLOSE cursor_name;
CREATE TABLE user (
id INT,
name VARCHAR(50)
);
INSERT INTO user VALUES (1,'Tom'),(2,'Jerry'),(3,'Alice');
DELIMITER $$
CREATE PROCEDURE cursor_demo()
BEGIN
DECLARE uid INT;
DECLARE uname VARCHAR(50);
DECLARE done INT DEFAULT 0;
-- 1. 声明游标
DECLARE cur CURSOR FOR
SELECT id, name FROM user;
-- 2. 声明 NOT FOUND 处理
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 3. 打开游标
OPEN cur;
-- 4. 循环取数据
read_loop: LOOP
FETCH cur INTO uid, uname;
IF done THEN
LEAVE read_loop;
END IF;
-- 示例:输出或处理数据
SELECT uid, uname;
END LOOP;
-- 5. 关闭游标
CLOSE cur;
END$$
DELIMITER ;
调用:
CALL cursor_demo();
✅ 行级数据处理
✅ 数据清洗 / 转换
✅ 复杂业务逻辑(不能一条 SQL 搞定)
✅ 批量更新 / 插入
例如:
UPDATE account SET balance = balance + 10 WHERE id = uid;
❌ 不能直接在普通 SQL 里用
JOIN / UPDATE / INSERT SELECT 就不要用游标✅ 推荐替代:
UPDATE user SET name = UPPER(name);
❌ 不推荐:
游标逐行更新
否则会死循环或报错
❌ 大表遍历
❌ 可以用集合操作完成的逻辑
❌ 高并发场景
如果你愿意,我可以:
你现在是学存储过程,还是在做具体功能?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。