mysql游标与存储函数实战-记录

  接上篇文章游标学习记录,现在对游标和存储函数实战
CREATE DEFINER=`sql_127`@`%` PROCEDURE `zyqyxczg_a004_b001_type`()
BEGIN
	#Routine body goes here...
	    /* 定义变量 */ 
    	DECLARE order_cursor int unsigned DEFAULT 1; -- 用于拼接insert语句
		DECLARE type_cursor varchar(100) character set 'utf8' DEFAULT null ;-- 商品类型,用于拼接insert语句
		DECLARE done int DEFAULT -1;  -- 用于控制循环是否结束: done=-1继续循环,done=1时退出循环
		
		/* 定义游标 */ 
		DECLARE myCursor CURSOR for 
		select 
			WD02 as '食品名称'
		from 
			cs_groupies_20210317.zyqyxczg_a004
		where 
			wd01 ='食品类'
		group by 
			WD02 
		order by 
			FIELD(WD02,'苹果','香蕉','西瓜','葡萄');
 
	/* 当游标到达尾部时,mysql自动设置done=1 */       
    DECLARE continue handler for not found set done=1;    
		
    /* 打开游标 */    
    OPEN myCursor;    
		
		/* 清空目标表 */ 
		truncate table cs_groupies_20210317.zyqyxczg_a004_b001_type;
		
		/* 循环开始 */    
		myLoop: LOOP
			/* 每次从结果集中获取一条数据,将结果集中的值赋值给变量type_cursor */   
			fetch myCursor into type_cursor;
		  -- 游标到达尾部,退出循环  
			if done = 1 then     
				leave myLoop;    
			end if;    
				
		/* do something */    
    		-- 循环插入问题类型到表中
			INSERT INTO cs_groupies_20210317.zyqyxczg_a004_b001_type(type_order,type_list)
			VALUES(order_cursor,type_cursor);
			
			-- 序号从1开始,每次循环+1
			set order_cursor = order_cursor + 1;
			
   		/* 循环结束 */    
		end loop myLoop;   
		
	/* 关闭游标,释放内存 */ 
	CLOSE myCursor;
	
END

这段 MySQL 存储过程的主要功能是从表 zyqyxczg_a004 中读取数据,并将这些数据插入到表 zyqyxczg_a004_b001_type 中。下面是对每部分代码的详细解释:

CREATE DEFINER=CURRENT_USER PROCEDURE zyqyxczg_a004_b001_type()
BEGIN

这是存储过程的定义部分。DEFINER=CURRENT_USER 表示存储过程的定义者是当前用户,zyqyxczg_a004_b001_type 是存储过程的名称。

	/* 定义变量 */ 
    DECLARE order_cursor int unsigned DEFAULT 1; -- 用于拼接insert语句
    DECLARE type_cursor varchar(100) character set 'utf8' DEFAULT null ;-- 商品类型,用于拼接insert语句
    DECLARE done int DEFAULT -1;  -- 用于控制循环是否结束: done=-1继续循环,done=1时退出循环

定义了三个变量

  1. order_cursor:无符号整数,用于记录当前的序号,初始值为 1。
  2. type_cursor:用于存储从游标中获取的数据。
  3. done:用于控制循环的变量。done 为 -1 时继续循环,为 1 时退出循环
	/* 定义游标 */ 
	DECLARE myCursor CURSOR for 
	select 
		WD02 as '食品名称'
	from 
		cs_groupies_20210317.zyqyxczg_a004
	where 
		wd01 ='食品类'
	group by 
		WD02 
	order by 
		FIELD(WD02,'苹果','香蕉','西瓜','葡萄');

定义了一个游标 myCursor,用于从 cs_groupies_20210317.zyqyxczg_a004 表中选择商品名称(WD02),筛选条件是 wd01 等于 ‘食品类’,并按指定的顺序进行排序。

    DECLARE continue handler for not found set done=1;

声明一个处理程序,当游标未找到更多数据时,将 done 设置为 1,表示循环应该结束。

    /* 打开游标 */    
    OPEN myCursor;    
		
	/* 清空目标表 */ 
	TRUNCATE table cs_groupies_20210317.zyqyxczg_a004_b001_type;

打开游标 myCursor,并清空目标表 cs_groupies_20210317.zyqyxczg_a004_b001_type,以便在后续操作中插入新的数据。

	/* 循环开始 */    
	myLoop: LOOP
		/* 每次从结果集中获取一条数据,将结果集中的值赋值给变量type_cursor */   
		fetch myCursor into type_cursor;
		-- 游标到达尾部,退出循环  
		if done = 1 then     
			leave myLoop;    
		end if;    
			
		/* do something */    
    	-- 循环插入问题类型到表中
		INSERT INTO cs_groupies_20210317.zyqyxczg_a004_b001_type(type_order,type_list)
		VALUES(order_cursor,type_cursor);
		
		-- 序号从1开始,每次循环+1
		set order_cursor = order_cursor + 1;
		
	/* 循环结束 */    
	end loop myLoop;

启动一个循环 myLoop:

  1. 从游标 myCursor 中获取一条数据,并将其存入 type_cursor。
  2. 如果 done 为 1,则退出循环。 将 order_cursor 和 type_cursor 插入到目标表zyqyxczg_a004_b001_type 中。
  3. order_cursor 每次循环后递增 1。
	/* 关闭游标,释放内存 */ 
	CLOSE myCursor;
	
END

关闭游标,释放内存,并结束存储过程。

这段代码的总体流程是:

定义变量和游标 -> 打开游标 -> 清空目标表 -> 循环处理游标中的数据 -> 关闭游标。
存储过程主要用于从一个表中读取数据并将其插入到另一个表中。

方便看代码,贴上代码图片
在这里插入图片描述

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值