温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标在 MySQL 怎么用

发布时间:2026-09-19 06:14:20 来源:亿速云 阅读:97 作者:小樊 栏目:数据库

在 MySQL 里,“游标(Cursor)”通常指在 存储过程 / 函数 / 触发器 中用来逐行遍历查询结果集的机制。普通 SQL 查询是直接返回结果集,而游标允许你在过程里一行一行处理数据。

下面从 基本用法 → 完整示例 → 注意事项 给你讲清楚。


一、游标的基本使用步骤

在 MySQL 存储过程中,使用游标一般分 5 步:

  1. 声明游标(DECLARE CURSOR)
  2. 声明结束标志(NOT FOUND 处理)
  3. 打开游标(OPEN)
  4. 逐行取值(FETCH)
  5. 关闭游标(CLOSE)

二、游标语法结构

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');

存储过程:用游标遍历 user 表

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;

五、重要注意事项(非常关键)

1️⃣ 游标只能在 存储过程 / 函数 中使用

❌ 不能直接在普通 SQL 里用


2️⃣ 游标性能较差

  • 不适合大表
  • 能用 JOIN / UPDATE / INSERT SELECT 就不要用游标

✅ 推荐替代:

UPDATE user SET name = UPPER(name);

❌ 不推荐:

游标逐行更新

3️⃣ 必须处理 NOT FOUND

否则会死循环或报错


4️⃣ MySQL 游标是 只读、向前 的

  • 不能回滚
  • 不能跳行

六、什么时候“不该用游标”

❌ 大表遍历
❌ 可以用集合操作完成的逻辑
❌ 高并发场景


如果你愿意,我可以:

  • 给你一个 实际业务场景的游标示例
  • 对比 游标 vs JOIN 写法
  • 讲 MySQL 8.0 的递归 CTE 替代游标

你现在是学存储过程,还是在做具体功能?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手