MySQL存储过程中使用游标更新数据的实例

方予
方予
发布时间:2026-10-14| 6人浏览过
原创

在MySQL开发中,当需要在存储过程中逐行处理查询结果时,游标(Cursor)是核心工具。本文将通过一个具体的业务场景——统计用户每日各科总分,演示如何正确声明游标、设置异常处理器以及在循环中执行数据更新操作。

应用场景与目标

假设我们有一个用户成绩表 userInfo,我们需要根据输入的日期 date_day,找出当天所有的用户,并将他们的语文和数学成绩相加,更新到汇总表 infoSum 中。由于需要将查询出的多行数据逐条处理并写入另一张表,使用游标是最直接的方法。

准备工作:表结构假设

为了理解代码逻辑,我们需要明确涉及的表结构:

  • userInfo 表:包含用户ID或用户名、各科成绩(如 chinese, math)、创建时间(createDate)。
  • infoSum 表:用于存储汇总数据,包含用户名(UserName)和总分字段(total)。

第1步:定义存储过程骨架与局部变量

首先,需要改变语句结束符为 $$,以便在存储过程内部使用分号。接着定义输入参数 in date_day datetime,并声明用于接收游标数据和控制循环状态的局部变量。

-- 修改结束符为 $$
DELIMITER $$

DROP PROCEDURE IF EXISTS getUserInfo $$

CREATE PROCEDURE getUserInfo(in date_day datetime)
BEGIN
    -- 声明用于接收游标数据的变量
    declare _userName varchar(12);
    declare _chinese int;
    declare _math int;
    
    -- 声明控制循环退出的标志位
    declare done int;

第2步:声明游标与异常处理器

这是游标的核心部分。需要声明一个名为 rs_cursor 的游标,指定其对应的 SELECT 语句。同时,必须声明 CONTINUE HANDLER,当游标取完数据返回 NOT FOUND 状态时,自动将 done 设置为 1,从而触发循环退出逻辑。

-- 定义游标:选取指定日期的用户名及两科成绩
DECLARE rs_cursor CURSOR FOR 
    SELECT username, chinese, math 
    FROM userInfo 
    WHERE datediff(createDate, date_day)=0;

-- 定义游标结束时触发的动作:设置 done=1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

第3步:参数校验与游标打开

在执行前进行简单的参数检查。如果传入的 date_day 为空,默认获取前一天的数据。随后,打开游标开始读取数据。

-- 获取昨天的日期(如果未提供日期)
if date_day is null then
    set date_day = date_add(now(),interval -1 day);
end if;

-- 打开游标
open rs_cursor;

第4步:构建循环逻辑执行更新

使用标签化的 Loop 结构进行遍历。在每次循环中:
1. FETCH 取出一行数据赋给局部变量。
2. 检查 done 是否为 1,如果是则跳出循环。
3. 执行业务逻辑:更新 infoSum 表中的总分。

cursor_loop:loop
    -- 从游标中取出当前行的数据
    FETCH rs_cursor into _userName, _chinese, _math;
    
    -- 如果到达末尾,跳出循环
    if done=1 then
        leave cursor_loop;
    end if;

    -- 业务逻辑:更新总分
    update infoSum 
    set total=_chinese+_math 
    where UserName=_userName;
end loop cursor_loop;

第5步:关闭游标与结束存储过程

循环结束后,务必关闭游标以释放资源,最后还原结束符。

-- 关闭游标
close rs_cursor;

END$$
DELIMITER ;

完成判断与注意事项

执行该存储过程后,可以通过查询 infoSum 表验证结果,确认总分是否已正确累加。在使用游标时需注意以下几点:
- 性能问题:游标逐行处理效率较低,大数据量下应考虑使用集合操作替代。
- 事务一致性:如果在循环内部有复杂操作,需考虑事务回滚机制。
- 内存占用:确保游标关联的结果集大小适中。

总结

本实例完整展示了MySQL存储过程中游标的标准用法,涵盖了从变量声明、游标定义、异常处理到循环执行的完整生命周期。掌握这一模式,可以灵活应对各种需要逐行处理数据的数据库编程任务。

以上就是MySQL存储过程中使用游标更新数据内容的详细内容,更多关于MySQL存储过程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。