当前位置: 首页 > news >正文

MySQL 中的游标(Cursor)

一、游标的作用

  • ​逐行处理数据​​:当需要对查询结果集中的每一行进行特定操作(如计算、条件判断、调用其他过程)时使用。
  • ​替代集合操作​​:在无法通过单一 SQL 语句完成复杂逻辑时,游标提供逐行处理的能力。
  • ​典型场景​​:数据迁移、报表生成、逐行校验等。

二、游标的使用步骤

游标使用遵循 ​​5个固定步骤​​,必须按顺序编写:

  1. ​声明游标​
    定义游标名称和对应的查询语句:

    DECLARE cursor_name CURSOR FOR SELECT_statement;
  2. ​声明错误处理器​
    处理游标遍历结束时的 NOT FOUND 状态,避免死循环:

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  3. ​打开游标​
    执行查询语句,生成结果集:

    OPEN cursor_name;
  4. ​循环获取数据​
    逐行读取数据并进行处理:

    FETCH cursor_name INTO variables;
  5. ​关闭游标​
    释放资源:

    CLOSE cursor_name;

三、完整示例

示例1:计算员工平均工资
DELIMITER //CREATE PROCEDURE calculate_avg_salary()
BEGINDECLARE emp_salary DECIMAL(10,2);DECLARE total DECIMAL(10,2) DEFAULT 0;DECLARE count INT DEFAULT 0;DECLARE done INT DEFAULT 0;-- 1. 声明游标DECLARE cur CURSOR FOR SELECT salary FROM employees;-- 2. 错误处理器DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;-- 3. 打开游标OPEN cur;-- 4. 循环读取read_loop: LOOPFETCH cur INTO emp_salary;IF done = 1 THENLEAVE read_loop;END IF;SET total = total + emp_salary;SET count = count + 1;END LOOP;-- 5. 关闭游标CLOSE cur;-- 输出结果SELECT total / count AS avg_salary;
END //DELIMITER ;-- 调用存储过程
CALL calculate_avg_salary();
示例2:处理订单状态
CREATE PROCEDURE update_order_status()
BEGINDECLARE order_id INT;DECLARE order_status VARCHAR(20);DECLARE done INT DEFAULT 0;DECLARE cur CURSOR FOR SELECT id, status FROM orders WHERE created_at < NOW() - INTERVAL 30 DAY;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur;loop_start: LOOPFETCH cur INTO order_id, order_status;IF done THENLEAVE loop_start;END IF;IF order_status = 'PENDING' THENUPDATE orders SET status = 'EXPIRED' WHERE id = order_id;END IF;END LOOP;CLOSE cur;
END;

四、注意事项

  1. ​性能问题​
    游标逐行操作会 ​​增加数据库负载​​,数据量大时效率低下,优先考虑集合操作(如 UPDATEJOIN)。

  2. ​作用域限制​
    游标必须在存储过程或函数的 ​​BEGIN-END块​​ 中声明,且所有 DECLARE 需放在其他语句之前。

  3. ​只读性​
    MySQL 游标默认是 ​​只读​​ 的,无法通过游标直接修改数据(需配合 UPDATE 语句)。

  4. ​错误处理​
    必须通过 CONTINUE HANDLER 处理 NOT FOUND 状态,否则可能陷入死循环。

  5. ​资源释放​
    游标使用后必须用 CLOSE 释放,否则可能导致内存泄漏。

  6. ​事务控制​
    在事务中使用游标时,注意 COMMIT 或 ROLLBACK 可能影响游标状态。

相关文章:

  • [计算机科学#8]:指令与程序的奥秘
  • c语言的常用关键字
  • WebRtc11:SDP详解
  • AE/PR模板 100个现代文字标题动态排版效果动画 Motion Titles
  • C++ unordered_set unordered_map
  • LearningFlow:大语言模型城市驾驶的自动化策略学习工作流程
  • 2023华为od统一考试B卷【二叉树中序遍历】
  • 5.2算法学习笔记(动态规划)
  • 文章七《深度学习调优与超参数优化》
  • 【东枫科技】AMD / Xilinx Alveo™ V80计算加速器卡
  • pip 常用命令及配置
  • SQL语句练习 自学SQL网 在查询中使用表达式 统计
  • 紫荆阁电玩平台环境搭建与系统运行实录(蒙特卡洛系列)
  • 从实列中学习linux shell9 如何确认 服务器反应迟钝是因为cpu还是 硬盘io 到底是那个程序引起的。cpu负载多高算高
  • python如何在深度学习框架目标检测算法使用Yolov8训练道路汽车漆面车漆缺陷数据集 建立基于YOLOv8道路汽车漆面缺陷(划痕)检测系统
  • Linux中的权限
  • spring-ai集成langfuse
  • 【愚公系列】《Manus极简入门》013-电影推荐专家:“银幕导航家”
  • MQTT 协议与 HTTP 协议的区别
  • 西电雨课堂《知识产权法》课后作业答案
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 全国共有共青团员7531.8万名,共青团组织439.7万个
  • 永辉超市回应顾客结算时被“反向抹零”:整改并补偿
  • 沈晓萍︱严金清:比斯坦因更早获得敦煌文物的无锡名士
  • 上海国际咖啡文化节开幕,北外滩集结了超350个展位
  • 济南高新区一季度GDP增长8.5%,第二产业增加值同比增长14.4%