接上篇文章游标学习记录,现在对游标和存储函数实战
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时退出循环
定义了三个变量:
- order_cursor:无符号整数,用于记录当前的序号,初始值为 1。
- type_cursor:用于存储从游标中获取的数据。
- 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:
- 从游标 myCursor 中获取一条数据,并将其存入 type_cursor。
- 如果 done 为 1,则退出循环。 将 order_cursor 和 type_cursor 插入到目标表zyqyxczg_a004_b001_type 中。
- order_cursor 每次循环后递增 1。
/* 关闭游标,释放内存 */
CLOSE myCursor;
END
关闭游标,释放内存,并结束存储过程。
这段代码的总体流程是:
定义变量和游标 -> 打开游标 -> 清空目标表 -> 循环处理游标中的数据 -> 关闭游标。
存储过程主要用于从一个表中读取数据并将其插入到另一个表中。
方便看代码,贴上代码图片