写BUG的派大星

Patrick Star

  • 首页
  • 归档

  • 搜索
设计模式 Gis Kafka Druid 微信小程序 Java 开源项目源码 物体识别 机器学习 Mybatis 微服务 Feign OpenVPN CSS Streamsets CDH SpringCloud SpringBoot maven 分布式 Shell Tree Linux js WebSocket 多线程 集群 Hadoop 大数据 JDK ElasticSearch MySQL 数据库 Redis Http Nginx

Mysql存储过程游标的使用

发表于 2020-12-28 | 分类于 数据库 | 0 | 阅读次数 554

场景

需要查询出一个结果集,并遍历它。此时需要用到游标(类似其他编程语言中的迭代器)。

本示例中,有两张表,user_table和job_table

user_table中有一个字段jobs用来保存用户的职业信息,而job_table是一张字典表。

如user_table中保存"1,2,3"则代表了job_table中id为1、2、3的职业

现在需要对user_table进行遍历,将"1,2,3"更新为实际的值"作家,个体经营,律师"这样子

使用方法

先看完整的存储过程:

DROP PROCEDURE IF EXISTS transfer_job;
CREATE PROCEDURE `transfer_job` () BEGIN
	DECLARE userId INTEGER;
	DECLARE jobs VARCHAR ( 255 );
	DECLARE s INT DEFAULT 0;
	DECLARE users CURSOR FOR SELECT id userId  FROM user_table;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'  SET s = 1;
	OPEN users;
		FETCH users INTO userId;
		WHILE s <> 1 DO
			SET @userId = userId;
			SELECT GROUP_CONCAT( `value` ) INTO @jobs  FROM job_table 
				WHERE FIND_IN_SET(`key`,(SELECT jobs FROM user_table WHERE id = @userId));
		UPDATE user_table SET jobs = @jobs WHERE id = @userId;
		FETCH users INTO userId;
	END WHILE;
	CLOSE users;
END 
  1. 声明需要用到的变量

    DECLARE userId INTEGER;
    	DECLARE jobs INTEGER;
    
  2. 声明遍历标志位

    DECLARE s INT DEFAULT 0;
    
  3. 声明游标

    DECLARE users CURSOR FOR SELECT id userId FROM user_table;
    
  4. 为标志位设置遍历结束时的取值

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'  SET s = 1;
    
  5. 正式遍历

    # 先打开游标
    OPEN users;
    # 将游标中的值复制给变量
    	FETCH users INTO userId;
    	# 根据标志位判断是否结束
    	WHILE s <> 1 DO
    	# 把上面的变量拿出来赋值给上面声明的变量
    		 SET @userId = userId;
    		 # 执行遍历逻辑
    		 # 再取出一个值,本次while代码段结束,将取出的值进入下一次循环判断
    		FETCH users INTO userId;
    		# 直到s = 1时彻底结束while循环
    	END WHILE;
    # 关闭游标
    CLOSE users;
    
  • 本文作者: Patrick
  • 本文链接: https://www.write1bug.cn/archives/mysql存储过程游标的使用
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式 # Gis # Kafka # Druid # 微信小程序 # Java # 开源项目源码 # 物体识别 # 机器学习 # Mybatis # 微服务 # Feign # OpenVPN # CSS # Streamsets # CDH # SpringCloud # SpringBoot # maven # 分布式 # Shell # Tree # Linux # js # WebSocket # 多线程 # 集群 # Hadoop # 大数据 # JDK # ElasticSearch # MySQL # 数据库 # Redis # Http # Nginx
ElasticSearch实现sql中的in和not in(JAVA)
Druid + MySQL 支持emoji表情
  • 文章目录
  • 站点概览
Patrick

Patrick

不是在改BUG,就是在写BUG。

52 日志
9 分类
36 标签
RSS
E-mail
Creative Commons
© 2018 — 2023 Patrick
人生如逆旅|我亦是行人
鲁ICP备18043140号-1