当前位置:网站首页> MySql存储过程循环的使用分析详解
MySql存储过程循环的使用分析详解
2022-06-29 17:52:00 【1024问】
简介
场景描述
解决方案
案例
总结
简介每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数、存储过程等)的用法就不大相同了,就好比Oracle与Mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享一下MySql存储过程中使用游标循环的处理方法。
我们举一个简单的场景,首先我们可能会有这样一种情况,考试成绩表(t_achievement)有一堆的sql脚本处理,需要依赖另一个学生表(t_student)数据对部分学生做考试成绩汇总记录到成绩汇总表(t_achievement_report)。
有一种方式就是通过代码优先将要汇总的学生表数据获取出来,然后按成绩汇总流程逐个将学生信息数据传递到成绩汇总业务代码进行处理。
另一种方式也是我们今天的主题,那就是通过存储过程的方式去做。
案例建表语句:
-- 学生信息表DROP TABLE IF EXISTS t_student;CREATE TABLE `t_student` ( `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键', `code` VARCHAR(10) NOT NULL COMMENT '学号', `name` VARCHAR(20) NOT NULL COMMENT '姓名', `age` INT(2) NOT NULL COMMENT '年龄', `gender` CHAR(1) NOT NULL COMMENT '性别(M:男,F:女)', PRIMARY KEY (`id`), UNIQUE KEY UK_STUDENT (`code`)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 学生成绩表DROP TABLE IF EXISTS t_achievement;CREATE TABLE `t_achievement` ( `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键', `year` INT(4) NOT NULL COMMENT '学年', `subject` CHAR(2) NOT NULL COMMENT '科目(01:语文,02:数学,03:英语)', `score` INT(3) NOT NULL COMMENT '得分', `student_id` BIGINT(12) NOT NULL COMMENT '所属学生id', PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 成绩汇总表DROP TABLE IF EXISTS t_achievement_report;CREATE TABLE `t_achievement_report` ( `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主键', `student_id` BIGINT(12) NOT NULL COMMENT '学生id', `year` INT(4) NOT NULL COMMENT '学年', `total_score` INT(4) NOT NULL COMMENT '总分', `avg_score` DECIMAL(4,2) NOT NULL COMMENT '平均分', PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;初始化数据:
INSERT INTO t_student(id, CODE, NAME, age, gender) VALUES(1, '2022010101', '小张', 18, 'M'),(2, '2022010102', '小李', 18, 'F'),(3, '2022010103', '小明', 18, 'M');INSERT INTO t_achievement(YEAR, SUBJECT, score, student_id) VALUES(2022, '01', 80, 1),(2022, '02', 85, 1),(2022, '03', 90, 1),(2022, '01', 60, 2),(2022, '02', 90, 2),(2022, '03', 98, 2),(2022, '01', 75, 3),(2022, '02', 100, 3),(2022, '03', 85, 3);

存储过程:
在这里主要以上面的场景为例,使用存储过程循环去处理数据。写一个存储过程,将以上数据每个学生的成绩进行汇总。
-- 如果存储过程存在,先删除存储过程DROP PROCEDURE IF EXISTS statistics_achievement;DELIMITER $$-- 定义存储过程CREATE PROCEDURE statistics_achievement()BEGIN -- 定义变量记录循环处理是否完成DECLARE done BOOLEAN DEFAULT FALSE; -- 定义变量传递学生idDECLARE studentid BIGINT(12);-- 定义游标DECLARE cursor_student CURSOR FOR SELECT id FROM t_student;-- 定义CONTINUE HANDLER,当循环结束时 done=trueDECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;-- 打开游标OPEN cursor_student;-- 重复遍历REPEAT -- 每次读取一次游标FETCH cursor_student INTO studentid; -- 计算总分、平均分插入汇总表INSERT INTO t_achievement_report(student_id, `YEAR`, total_score, avg_score)SELECT studentid, `YEAR`, SUM(score), ROUND(SUM(score) / 3, 2) FROM t_achievement t1 WHERE student_id = studentid AND NOT EXISTS(SELECT 1 FROM t_achievement_report t2 WHERE student_id = studentid AND t1.year = t2.year) GROUP BY `YEAR`;-- 结束循环,意思是等到done=true时,结束循环REPEATUNTIL done END REPEAT;-- 查询结果,仅会展示查出的最后一条SELECT studentid;-- 关闭游标CLOSE cursor_student;END$$DELIMITER ;-- 执行存储过程CALL statistics_achievement();执行结果,返回查询结果3,即最后一条学生记录id


存储过程也有很强大的功能,如果是一名DBA那么写存储过程是分分钟的事,但是作为一名专做业务的码农还是不建议去使用存储过程写业务代码。前公司同事适应了写存储过程,有业务改动时不时的直接用存储过程搞定了,到最后直接就是一大堆堆存储过程代码,一个存储过程下来几百上千行sql代码头都看晕掉,出问题巨难维护,稍有不熟的人员都不敢轻举妄动,今天在这里也只是为了讲解存储过程中的循环而举了个栗子请别介意。
总之我认为存储过程主要还是用来临时处理一些数据方便而用一下,特别有些业务改造大,需要做数据割接总不能挨个去写一个业务代码吧。
到此这篇关于MySql存储过程循环的使用分析详解的文章就介绍到这了,更多相关MySql存储过程循环内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- 基于gis三维可视化的智慧城市行业运用
- ABC253 D FizzBuzz Sum Hard(容斥定理)
- 两种Controller层接口鉴权方式
- Spingmvc requests and responses
- Image migration and data migration synchronization of old and new servers with different Alibaba cloud accounts
- /usr/bin/ld: warning: **libmysqlclient.so.20**, needed by //usr/
- Niuke Xiaobai monthly race 52 E group logarithmic sum (inclusion exclusion theorem + dichotomy)
- SRM supplier collaborative management system function introduction
- Web Scraping with Beautiful Soup for Data Scientist
- [target tracking] |stark configuration win OTB
猜你喜欢

Precondition end of script headers or end of script output before headers

selenium 文件上传方法

Distributed | several steps of rapid read / write separation

Xiaobai yuesai 51 supplement e g f

Proxmox VE Install 7.2

MATLAB 最远点采样(FPS)

面试中问最常问的海量数据处理你拿捏了没?

布隆过滤器:

Wechat applet development reserve knowledge

QQ如何开通在线客服
随机推荐
MaxCompute Studio
关于日期相加减问题
SCM系统是什么?供应链管理系统有哪些优势?
MATLAB 最远点采样(FPS)
Top 30 open source software
Selenium key combination operation
Image feature computation and representation -- content based image retrieval
Distributed | several steps of rapid read / write separation
ISO 32000-2 国际标准7.7
Test dble split function execution + import time-consuming shell script reference
You can do sideline work
MaxCompute字符串替换函数-replace
js两个二维数组合并并去除相同项(整理)
[try to hack] cookies and sessions
Prevent form resubmission based on annotations and interceptors
Xiaomai technology x hologres: high availability of real-time data warehouse construction of ten billion level advertising
Does rapid software delivery really need to be at the cost of security?
What technology is an applet container? Can it help Internet of things enterprises break through the red sea?
Visual studio plug-in coderush officially released v22.1 -- visual tool for optimizing debugging
Software testing - you may not understand the basic theoretical knowledge