MySQL——游标(cursor)

一、什么是游标?

游标(Cursor) 是MySQL中用于逐行处理查询结果集的数据库对象。它类似于指针,允许开发者在结果集中逐行移动,并对每一行数据进行特定操作。游标将传统的集合操作转换为面向过程的记录处理方式,特别适用于需要逐行逻辑判断或复杂计算的场景。

为什么需要游标?

  • 逐行处理:如根据每行数据动态生成计算结果或触发业务逻辑。

  • 复杂逻辑:需要基于当前行数据状态执行条件分支操作。

  • 个性化操作:不同记录需要不同的处理策略(如生成定制化报告)。


二、游标的优缺点:权衡使用场景

优点

  1. 灵活性强:支持逐行数据访问与操作。

  2. 内存高效:分批处理大型结果集,避免一次性加载内存溢出。

  3. 过程化控制:可在循环中结合条件判断和变量计算。

缺点

  1. 性能开销:比集合操作(如JOIN、子查询)效率低。

  2. 资源消耗:占用数据库连接资源,长时间未关闭可能导致阻塞。

  3. 复杂度高:代码量增加,调试和维护难度大。


三、游标操作流程:五步掌握核心用法

1. 声明游标

DECLARE cursor_name CURSOR FOR 
SELECT column1, column2 FROM table WHERE condition;
  • 作用:定义游标名称和关联的查询,不执行查询

2. 打开游标

OPEN cursor_name;
  • 作用:执行关联的SELECT语句,生成结果集。

3. 获取数据

FETCH cursor_name INTO var1, var2;
  • 作用:将当前行数据存入变量,游标下移一行。

4. 处理结束条件

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  • 作用:当FETCH无更多数据时触发,设置结束标志。

5. 关闭游标

CLOSE cursor_name;
  • 作用:释放游标占用的资源,必须显式调用


四、实战案例:游标典型应用场景

案例1:生成学生成绩评估报告

需求:为每个学生的每门课程生成等级和建议。

DELIMITER $$
CREATE PROCEDURE generate_grade_reports()
BEGINDECLARE v_sid INT;DECLARE v_score DECIMAL(5,2);DECLARE done INT DEFAULT 0;-- 声明游标:获取所有学生成绩DECLARE grade_cursor CURSOR FORSELECT sid, score FROM t_score;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN grade_cursor;grade_loop: LOOPFETCH grade_cursor INTO v_sid, v_score;IF done THEN LEAVE grade_loop; END IF;-- 根据分数生成等级CASE WHEN v_score >= 90 THEN INSERT INTO t_report VALUES (v_sid, 'A', '优秀');WHEN v_score >= 80 THEN INSERT INTO t_report VALUES (v_sid, 'B', '良好');-- 更多条件...END CASE;END LOOP;CLOSE grade_cursor;
END $$
DELIMITER ;

案例2:统计学生总分与平均分

需求:逐学生计算总分、平均分并汇总。

DELIMITER $$
CREATE PROCEDURE calculate_student_stats()
BEGINDECLARE v_sid INT;DECLARE v_total, v_avg DECIMAL;DECLARE done INT DEFAULT 0;-- 声明游标:遍历学生DECLARE student_cursor CURSOR FORSELECT sid FROM t_student;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN student_cursor;student_loop: LOOPFETCH student_cursor INTO v_sid;IF done THEN LEAVE student_loop; END IF;-- 计算当前学生的统计值SELECT SUM(score), AVG(score) INTO v_total, v_avgFROM t_score WHERE sid = v_sid;INSERT INTO t_stats VALUES (v_sid, v_total, v_avg);END LOOP;CLOSE student_cursor;
END $$
DELIMITER ;

案例3:批量调整课程成绩

需求:为某课程所有学生成绩增加固定分值,不超过100分。

DELIMITER $$
CREATE PROCEDURE adjust_scores(IN course_id INT, IN adjust DECIMAL)
BEGINDECLARE v_sid INT;DECLARE v_old_score DECIMAL;DECLARE done INT DEFAULT 0;-- 声明游标:获取指定课程成绩DECLARE score_cursor CURSOR FORSELECT sid, score FROM t_score WHERE cid = course_id;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN score_cursor;adjust_loop: LOOPFETCH score_cursor INTO v_sid, v_old_score;IF done THEN LEAVE adjust_loop; END IF;-- 计算新成绩并更新UPDATE t_score SET score = LEAST(v_old_score + adjust, 100)WHERE sid = v_sid AND cid = course_id;END LOOP;CLOSE score_cursor;
END $$
DELIMITER ;

五、常见问题与解决方案

问题1:游标死循环

  • 现象:存储过程无法退出循环。

  • 原因:未正确处理NOT FOUND条件。

  • 解决:确保声明CONTINUE HANDLER并设置终止标志。

问题2:游标性能低下

  • 现象:处理速度慢,数据库负载高。

  • 原因:循环内执行复杂查询或大量计算。

  • 解决:预先计算中间结果,使用临时表存储数据。

问题3:资源泄漏

  • 现象:连接数异常增长,数据库响应变慢。

  • 原因:未显式关闭游标。

  • 解决:在结束处理后务必执行CLOSE


六、最佳实践与优化建议

  1. 限制使用场景:优先使用集合操作,仅在必须逐行处理时使用游标。

  2. 优化查询语句:游标关联的SELECT语句需高效,避免全表扫描。

  3. 批量提交事务:在循环内定期COMMIT,减少锁竞争。

  4. 资源及时释放:处理完成后立即关闭游标。

  5. 监控性能:使用EXPLAIN分析查询计划,检查执行时间。


七、总结

适用场景

  • 逐行数据校验(如格式检查)

  • 动态生成报告(如个性化评价)

  • 级联更新/删除(如历史数据迁移)

慎用场景

  • 大数据量处理(性能敏感)

  • 高并发业务(资源竞争激烈)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步编程——微信小程序

1. 前言 引用来自:微信小程序开发中的多线程处理与异步编程_微信小程序 多线程-CSDN博客 微信小程序是基于JavaScript开发的,与浏览器JavaScript不同,小程序运行在WebView内部,没有多线程的概念。小程序的 JavaScript 是单线程的…

HarmonyOS-ArkUI V2状态-PersistenceV2:持久化存储UI状态

PersistenceV2类是一个与AppStorageV2类用法非常相似的类。因为它俩是子类和父类的关系。如果不了解AppStorageV2,可以先跳转至了解一下这个类。 HarmonyOS-ArkUI V2工具类:AppStorageV2:应用全局UI状态存储-CSDN博客 PersistenceV2相比于其父类AppStorageV2而言,它存储的…

《Mycat核心技术》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架构

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件应用点击apk无反应的处理

最近遇到一个问题,在A13上,打开文件管理应用时,点击apk 无反应或者启动安装进程后安装完成或取消安装进程,再次点击apk 无反应。在此记录该问题。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷题记录贴

1.题目:现在运营想要对用户的年龄分布开展分析,在分析时想要剔除没有获取到年龄的用户,请你取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。 错误:select device_id,gender,age,un…

【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python爬虫降低IP封禁,python爬虫除了使用代理IP和降低请求频率,还有哪些方法可以应对IP封禁?

文章目录 前言1. 利用 CDN 节点2. 模拟真实用户行为3. 使用 IP 池轮换策略4. 处理 Cookie 和会话信息5. 分布式爬虫 前言 除了使用代理 IP 和降低请求频率,以下这些方法也能应对 IP 封禁: Python 3.13.2安装教程(附安装包)Python…

光谱相机的成像方式

光谱相机的成像方式决定了其如何获取物体的空间与光谱信息,核心在于分光技术与扫描模式的结合。以下是主要成像方式的分类解析: ‌一、滤光片切换型‌ ‌1. 滤光片轮(Filter Wheel)‌ ‌原理‌:通过旋转装有多个窄带…

AI在市场营销分析中的核心应用及价值,分场景详细说明

以下是 AI在市场营销分析中的核心应用及价值,分场景详细说明: 1. 客户行为分析与细分 AI技术应用: 机器学习:分析用户点击、购买、浏览等行为数据,识别消费模式(如高频购买时段、偏好品类)。聚…

浔川AI翻译v7.0更新预告

亲爱的浔川AI翻译用户: 感谢您一直以来的支持!浔川AI翻译自推出以来,已迭代6个版本,其中**v2.0和v4.0因技术问题(翻译结果显示异常、注册失败、密码找回功能失效等)**被迫下架。我们深知这些问题影响了您…

LabVIEW中二维数组转换为彩色图

在 LabVIEW 编程环境下,有用户想把二维数组转化为彩色图片。通过附件的程序示例,给出了具体实现方法,包括对数据的处理以及颜色映射的设置等内容,还涉及解决数据范围与颜色映射不匹配等问题。公司官网有源码 程序功能及细节 功能&…

【模型常见评价指标(分类)】

目录 常见指标 其他的评估指标 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常见指标 其他的评估指标 3.1 BLEU BLEU(Bilingual Evaluation Understudy,双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质…

期货数据API对接实战指南

一、期货数据接口概述 StockTV提供全球主要期货市场的实时行情与历史数据接口,覆盖以下品种: 商品期货:原油、黄金、白银、铜、天然气、农产品等金融期货:股指期货、国债期货特色品种:马棕油、铁矿石等区域特色期货 …

TCP连接建立:为什么是三次握手?

接下来,以三个方面分析三次握手的原因: 1、三次握手才可以阻止重复历史连接的初始化(主要原因) 2、三次握手才可以同步双方的初始化序列号 3、三次握手才可以避免资源浪费 原因一:避免历史连接 简单来说&#xff0…

Table类型的表单

形如下面的图片 1 label与prop属性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "删除时间",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…

Cesium 加载 本地 b3dm 格式文件 并且 获取鼠标点击处经纬度 (亲测可用)

很奇怪cesium 里面只支持 相对路径 不支持绝对路径 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源码 const viewer new Cesium.Viewer("cesiu…

Spring AI核心之“ChatClient”-来自DeepSeek

在 Spring AI 生态中,ChatClient 是一个面向开发者设计的高层抽象接口,它简化了与大型语言模型(LLMs)的交互流程,尤其适用于需要快速构建端到端 AI 应用(如聊天机器人、RAG 问答系统等)的场景。…

购买电脑时,主要需要关注以下核心配置,它们直接影响性能、使用体验和价格。根据需求(办公、游戏、设计、编程等),侧重点会有所不同。看看Deepseek的建议

1. 处理器(CPU) 作用:电脑的“大脑”,影响整体运算速度和多任务处理能力。关键参数: 品牌与型号:Intel(酷睿i3/i5/i7/i9)或 AMD(锐龙R3/R5/R7/R9)。核心/线程…

408数据结构绪论刷题001

答案:D 解析: • A选项:数据元素是组成数据对象的基本单位 ,它只是数据的基本个体,不能完整定义数据结构,所以A选项错误。 • B选项:数据对象是性质相同的数据元素的集合,仅仅描述…

c++STL——vector的使用和模拟实现

文章目录 vector的使用和模拟实现vector的使用vector介绍重点接口的讲解迭代器部分默认成员函数空间操作增删查改操作迭代器失效问题(重要)调整迭代器 vector的模拟实现实现的版本模拟实现结构预先处理的函数尾插函数push_backswap函数赋值重载size函数reserve函数 迭代器默认成…