MySQL双层游标嵌套循环方法

news2024/11/17 15:38:43

文章目录

    • 1、需求描述
    • 2、思路
    • 3、创建存储过程


1、需求描述

1、在项目中,需要将A表中主键id,逐个取出,作为条件,在B表中去逐一查询,将B表查询到的结果集(A表B表关系:一对多),逐一遍历,连同A表的id拼接运算,逐个插入到C表中。

2、 在Java中很容易实现,A表获取到的结果集,循环遍历取出id,去B表查询;遍历B表结果集,插入到C表中。 相当于2个循环,即可实现需求。 这样会有一个问题,频繁连接数据库,造成大量资源开销。 那么在存储过程中,该怎么实现呢?

2、思路

  要实现逐行获取数据,需要用到MySQL中的游标,一个游标相当于一个for循环,这里需要用到2个游标。如何在MySQL中实现游标双层循环呢?

3、创建存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `student`()
BEGIN
	-- 定义变量
	
		-- 假设有一张学生表,有id,student_name字段
		DECLARE outer_done INT DEFAULT FALSE; -- 外层游标控制变量
		DECLARE studentTableId int;    -- 学生表ID
		declare studentTableName VARCHAR(100);   -- 学生姓名
		declare outer_cursor cursor for select id,student_name from student_table  where `disable` = '0'; 
		DECLARE CONTINUE HANDLER FOR NOT FOUND SET outer_done = TRUE;


		open outer_cursor;     
			while not outer_done do
					fetch outer_cursor into studentTableId,studentTableName;  -- 这里循环取值,赋值到上面定义的变量中
						-- 开始定义内层游标
						BEGIN -- inner BEGIN
						
								-- 假设有一张成绩表,包含字段id,student_name,score字段
								DECLARE scoreTableId int;    -- 成绩Id
								declare scoreTableName VARCHAR(100);    -- 学生名字
								declare scoreTableScore float;   -- 学生分数
								DECLARE inner_done int DEFAULT FALSE ;
								DECLARE my_value VARCHAR(255);
								declare inner_cursor cursor for select id,student_name,score from score_table where `disable` = '0'; 
								DECLARE CONTINUE HANDLER FOR NOT FOUND SET inner_done  = TRUE ;
														
								OPEN inner_cursor; -- 打开内层游标
								WHILE not inner_done DO -- inner WHILE
									FETCH inner_cursor INTO scoreTableId,scoreTableName,scoreTableScore ; -- 从【内层游标】中获取数据,赋值到定义变量中
									
									 IF studentTableName = scoreTableName THEN    -- 判断名字一样(测试,生产不要用名称进行判断)
										set my_value = CONCAT_WS('-',studentTableName,scoreTableScore);    -- 给变量赋值 CONCAT_WS函数可以按照固定的连接符,将数据进行连接,例如 张三-95
										select my_value;     -- 打印变量值
									 END IF;
									 -- 假设有一张汇总表(summary_table),将处理的数据进行更新
									 update summary_table set summary_column=my_value where summary_table_student_id=studentTableId;
								END WHILE ; -- END inner WHILE
								CLOSE inner_cursor; -- 循环结束后,关闭内层游标
						END; -- END inner BEGIN
			end while;        
		close outer_cursor;  
END

看图清晰一点。

在这里插入图片描述
  到这里就完成了,存储过程里面的注释很详细,就不多赘述了,我在写存储过程中也是踩了不少坑,记录下来,希望能帮到各位coder。

  有问题欢迎评论区留言或者私信,我看到就会回复。

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

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

相关文章

【软件开发规范篇】Git分支使用规范

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

TCP/IP协议族中的TCP(一):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字…

vue项目npm run build 打包之后如何在本地访问

vue项目npm run build 打包之后如何在本地访问 如果直接访问时,则会报错如下的信息: 报错码: Access to script at file:///D:/assets/index-DDVBfHVo.js from origin null has been blocked by CORS policy: Cross origin requests are on…

[RocketMq:基于容器化]:快速部署安装

文章目录 一:相关镜像准备:RocketNameServer1.1:查看相关镜像和版本1.2:拉取镜像1.3:配置和运行RocketNameServer容器 二:相关镜像准备:RocketBroker2.1:创建配置目录和broker配置文…

《软件设计师教程:计算机网络浅了解计算机之间相互运运作的模式》

​ 个人主页:李仙桎 🔥 个人专栏: 《软件设计师》 ⛺️生活的理想,就是为了理想的生活! ​ ⛺️前言:各位铁汁们好啊!!!,今天开始继续学习中级软件设计师考试相关的内容&#xff0…

通用模型Medprompt如何在医学领域超越专家系统

在AI的发展历程中,一直存在着两种理念的较量:一种是追求普适性的通用AI模型,另一种是针对特定领域深度优化的专业AI系统。最近,微软的研究团队在这一辩论中投下了一枚重磅炸弹——他们开发的Medprompt策略,使得通用AI模…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作,需要一个小型的封装晶体振荡器来提供参…

合合信息Embedding模型获得MTEB中文榜单第一

前言 最近几年,可以说大语言模型汇聚了所有的光彩,大语言模型的飞速发展更是吸引着社会各界的目光,这些模型的强大能力源自于Embedding技术的支撑,这种技术将语言转化为机器可理解的数值向量。随着大型语言模型的不断突破&#x…

产品经理一定得把ppt做的很高大上吗

严格来说你的这个PPT不能说是丑,只能说不好看,但并非你自己说的那种非常不好看。百分制的话我能给到60分左右,属于勉强及格的水准。PPT好看的标准很模糊也很客观,每个人的审美水平有高低,所以很难做到众人都挑不出毛病…

onlyoffice 的使用感受

自接触onlyoffice到使用,半年多了,因为Windows server2008要使用,属于非常古老的服务器了,所以费了好大力气才安装上去了。 如果是linux下使用docker则非常简单了,几个命令就把onlyoffice安装上去了。 对于当今的机器…

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时,请确保遵守相关法律法规和网站的服务条款&#x…

c调用python , 有参无参

文章目录 1. c语言调用python 的步骤1.1 包含头文件1.2 初始化Python解释器1.3 添加当前路径到sys.path 中1.4 导入要调用的模块1.5 获取函数对象1.5.1 检查函数对象是否可被调用 1.6 构造参数1.7 调用函数并获取返回值1.8 返回值解析1.9 释放引用的所有python对象1.10 关闭pyt…

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中,经常需要自定义控件,并且定义控件的属性,方便灵活的修改控件的显示样式,提…

【CLion】clion无法加载或找不到cmakekists文件

一、问题表象 最近工作中,在git pull远程仓库最新版本程序后,平时打开CLion自动加载的工程CMakeLists文件突然失效(显示找不到可编译的文件),无法debug程序。 二、原因分析 基于平时的编码经验和之前git pull也出现…

李沐64_注意力机制——自学笔记

注意力机制 1.卷积、全连接和池化层都只考虑不随意线索 2.注意力机制则显示的考虑随意线索 (1)随意线索倍称之为查询(query) (2)每个输入是一个值value,和不随意线索key的对 (3)通过注意力池…

Oracle集群ORA-03113:end-of-file on communication channel

一、问题场景描述 今天Oracle集群要更新各数据库的数据,折腾的启动不了了: --》数据量比较大,数据泵方式导出的dmp文件 准备导入集群 --》由于之前的生产数据库数据比较少,需要增大表空间。 --》于是在sqlplus命令窗口&#xff0c…

ChatGPT4.0知识问答、DALL-E生成AI图片、Code Copilot辅助编程,打开新世界的大门

目录 1、DALL-E 文字转图片 在线AI修改2、Write For Me3、Code Copilot 目前最强的AI编程大模型4、Diagrams: Show Me5、Instant Website [Multipage] 网站合成神器6、AskYourPDF Research Assistant 无限PDF7、Diagrams & Data: Research, Analyze, Visualize 精读Excel …

kuramoto模型 - 简要介绍

Kuramoto模型源远流长,这里不会对它做过于理论方面的讲解,只是面向动力学重构的工作中,可能要用到Kuramoto模型的相关介绍。 假设读者了解的常微分方程基本概念,图论知识,了解邻接矩阵, 通过本文&#xf…

归并排序详解

目录 归并排序的核心思想: 递归实现: 非递归实现: 时间复杂度: 空间复杂度: 应用场景: 本文全部以升序为例: 归并排序的核心思想: 先分解在合并: 1.归并的归&…

运算符重载(2)

1.赋值运算符重载 #include<iostream> using namespace std;class Person { friend void test01(); public:Person(int age){m_Age new int(age);}/*堆区的数据由程序员手动开辟并手动释放*/~Person(){if (m_Age ! NULL){delete m_Age;}}Person& operator(Person &a…