游标用于在检索出来的结果集中前进或后退一行或多行。MySQL中游标只能用于存储过程
1 使用步骤
创建(定义)游标,这个过程实际上没有检索数据,只是定义要使用的SELECT语句
打开游标,这个过程用前面定义的SELECT语句把数据实际检索出来。新版SQL游标打开关闭不能直接使用,需要放在存储过程中
使用游标,对于填有数据的游标,根据需要取出(检索)各行
关闭游标
2 操作
2.1 检索单行
CREATE PROCEDURE processorders(
OUT o DECIMAL (8, 2))
BEGIN
DECLARE ordernumbers CURSOR FOR
SELECT order_num FROM `order`;
-- 定义游标
OPEN ordernumbers;
-- 打开游标
FETCH ordernumbers INTO o;
-- 将第一列的值赋值给o
CLOSE ordernumbers;
-- 关闭游标
END;
#创建带游标的存储过程
CALL processorders(@order_num);
SELECT @order_num
#执行并展示
2.2 循环检索
CREATE PROCEDURE processorders()
BEGIN
DECLARE o int;
DECLARE done BOOLEAN DEFAULT 0;
DECLARE ordernumbers CURSOR FOR
SELECT order_num FROM `order`;
-- 定义游标
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- 定义CONTINUE HANDLER,当SQLSTATE '02000'(代表未找到条件)出现时,done=1
OPEN ordernumbers;
-- 打开游标
REPEAT
-- 开始循环
FETCH ordernumbers INTO o;
-- 将值赋值给o
UNTIL done END REPEAT;
-- 结束循环
CLOSE ordernumbers;
-- 关闭游标
END;
#创建带游标的存储过程
2.3 循环体中增加执行
CREATE PROCEDURE processorders()
BEGIN
DECLARE o int;
DECLARE done BOOLEAN DEFAULT 0;
DECLARE t DECIMAL(8,2);
DECLARE ordernumbers CURSOR FOR
SELECT order_num FROM `order`;
-- 定义游标
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- 定义CONTINUE HANDLER,当SQLSTATE '02000'(代表未找到条件)出现时,done=1
CREATE TABLE IF NOT EXISTS ordertotals(order_num INT,total DECIMAL(8,2));
-- 若表不存在则创建表
OPEN ordernumbers;
-- 打开游标
REPEAT
-- 开始循环
FETCH ordernumbers INTO o;
-- 将值赋值给o
CALL ordertotal(o,1,t);
-- 调用存储过程
INSERT INTO ordertotals(order_num,total)
VALUES(o,t);
--插入数据到新表
UNTIL done END REPEAT;
-- 结束循环
CLOSE ordernumbers;
-- 关闭游标
END;
CALL processorders();
#执行,生成新表并插入数据
文章转载自lin在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




