MySQL双层游标嵌套循环方法

文章目录

    • 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;    -- 学生表IDdeclare 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 dofetch outer_cursor into studentTableId,studentTableName;  -- 这里循环取值,赋值到上面定义的变量中-- 开始定义内层游标BEGIN -- inner BEGIN-- 假设有一张成绩表,包含字段id,student_name,score字段DECLARE scoreTableId int;    -- 成绩Iddeclare 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 WHILEFETCH inner_cursor INTO scoreTableId,scoreTableName,scoreTableScore ; -- 从【内层游标】中获取数据,赋值到定义变量中IF studentTableName = scoreTableName THEN    -- 判断名字一样(测试,生产不要用名称进行判断)set my_value = CONCAT_WS('-',studentTableName,scoreTableScore);    -- 给变量赋值 CONCAT_WS函数可以按照固定的连接符,将数据进行连接,例如 张三-95select my_value;     -- 打印变量值END IF;-- 假设有一张汇总表(summary_table),将处理的数据进行更新update summary_table set summary_column=my_value where summary_table_student_id=studentTableId;END WHILE ; -- END inner WHILECLOSE inner_cursor; -- 循环结束后,关闭内层游标END; -- END inner BEGINend while;        close outer_cursor;  
END

看图清晰一点。

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

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

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

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

相关文章

在CentOS7中wget命令显示not found怎么解决

实验需要,在本机上安装了一个CentOS7虚拟机,运行wget命令时显示not found。按照网上的教程,使用命令sudo yum install wget,依然失败。 怎么回事呢?会不会是网络的原因呢?想到这,ping了一下www…

达梦(DM) SQL日期操作及分析函数

达梦DM SQL日期操作及分析函数 日期操作SYSDATEEXTRACT判断一年是否为闰年周的计算确定某月内第一个和最后一个周末某天的日期确定指定年份季度的开始日期和结束日期补充范围内丢失的值按照给定的时间单位查找使用日期的特殊部分比较记录 范围处理分析函数定位连续值的范围查找…

DNA序列k-mers哈希映射和相似序列查找

对DNA序列的k-mer进行哈希映射和相似序列查找是生物信息学中常见的任务之一。使用哈希函数对DNA序列的k-mer进行映射,并使用哈希表进行相似序列的查找。这种方法可以加速相似序列的搜索,并在处理大规模DNA序列数据时具有较好的性能。 哈希函数是一种将输…

C++系列-输入输出

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C输入和输出 我们都知道C语言的输出是用printf函数来实现的&#xff0c;那么C呢&#xff0c;它的实现逻辑是什么呢&#xff0c;让我们一起来看一下&#xff0c; #include<i…

docker入门级命令

基本概念 docker的连个基本概念&#xff1a;镜像、容器。 docker镜像可以理解为是存储docker安装包的地方&#xff0c;比如&#xff1a;mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如&#xff1a;…

K8S 调试运行中报错的 Pod

开始调试有问题的 Pod 准备环境 创建一个例子用于测试&#xff1a; apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploymentnamespace: apps spec:selector:matchLabels:app: nginxreplicas: 2template:metadata:labels:app: nginxspec:containers:- name: …

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

android 上传视频

1.在页面按钮或图标控件中添加点击事件&#xff0c;并调用选择文件动作 //点击图片选择视频按钮事件public void uploadvideo(View view){Intent intent new Intent(Intent.ACTION_GET_CONTENT); // 选择文件动作intent.setType("video/*"); …

python数据分析与可视化

Python数据分析与可视化是数据科学领域的重要技能&#xff0c;它涉及到使用Python语言及其丰富的库来分析数据、提取信息、并将其转换为易于理解的图表和图形。以下是Python数据分析与可视化的一些关键点&#xff1a; ### 1. 数据分析库 - **Pandas**&#xff1a;用于数据处理…

IDEA离线安装插件

1、下载地址 https://plugins.jetbrains.com/idea 如果去其他编辑器&#xff0c;点击下拉&#xff0c;选择即可。 2.搜索 在输入框输入关键词&#xff0c;按照提示选择即可&#xff0c;点击搜索按钮&#xff0c;查看结果。 3、选择版本 按照自己的版本选择合适的版本 4、安…

8086:qemu执行汇编

正文 环境&#xff1a;macOS M1。 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的虚拟机监视器&#xff0c;可以模拟多种硬件平台&#xff0c;包括处理器架构、设备和操作系统。QEMU具有以下主要功能和用途&#xff1a; 硬件模拟器&#xff1a;QEMU可以模拟多种处理…

TP8 利用jwt 生成token

使用Composer安装依赖库&#xff0c;终端切换到项目根目录输入如下 composer require firebase/php-jwt 下面是示例代码&#xff1a; <?php namespace app\common\base;use Firebase\JWT\JWT; use Firebase\JWT\Key;class Token {/*** 创建 token* param array $data 必填…

linux的SSH(远程登录)服务

目录 1.SSH远程管理 1.1 SSH的概述 1.2 OpenSSH服务器 1.3 SSH端口、配置文件 2.服务端重要配置 3.登录验证方式 3.1 密码验证 3.2 密钥对验证 4.使用 SSH 客户端程序 4.1 ssh 远程登录 4.2 scp 远程复制 4.3 sftp文件传输 5.创建使用密钥对 6.TCP Wrappers访问控…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

机器学习之sklearn基础教程

Scikit-learn&#xff08;简称sklearn&#xff09;是一个广泛使用的机器学习库。 1. **安装sklearn**&#xff1a;推荐使用Anaconda进行安装&#xff0c;以避免配置和环境问题。也可以直接通过pip命令安装&#xff1a;pip install scikit-learn。 2. **数据集生成**&#xff1…

如何在 CentOS VPS 上配置 vsftpd 使用 SSL/TLS

介绍 FTP&#xff08;文件传输协议&#xff09;是一种在本地和远程服务器之间传输文件的方式。尽管非常流行和普遍&#xff0c;但由于其设计中固有的安全性缺失&#xff0c;使用这种文件传输方法已经不再受欢迎。 一个非常有能力的替代方案是SFTP&#xff0c;如上所述。该协议…

conda修改当前环境中的python版本

1. 首先查看当前的python版本 python -V 2. 进入已经激活的conda环境&#xff0c;搜索库中有无想要的python版本(若有想安装的版本可跳过) conda search --full --name python 3. 安装库中存在且符合要求的python版本即可(以python3.8.1为例) conda install python3.8.1

深度学习的模型转换(.pt转换为.engine)

缘由 最近观察发现,深度学习的例子有很多,但是模型的转换总是有很多问题,没有一个标准的转换方法。有的是直接用YOLO里面自带的export.py进行转换,也有的人利用TensorRT里面的bin文件夹的trtexec.exe转换,结果两种转换之后的格式不一样。所以最近就整理了网上的转换办法,…

springboot WebSocket的用法

Spring Boot中使用Java API创建WebSocket 添加WebSocket的依赖项 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>创建WebSocket端点 import javax.webs…

sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…