1. 游标的概念
游标本质:查询后的结果集。对查询的结果集进行前一行或后一行类似的操作时就可以使用到游标
2. 游标的语法
1. 语法
- 定义游标: declare 游标名称 cursor for 查询语句;
- 打开游标: open 游标名称
- 对查询的结果集(游标)进行检索行至变量提供使用
- 关闭游标: close 游标名称
2. 举例
create procedure 存储过程名称()
begin
– 游标 –
– xx名称,打开游标后抓取每行,将结果赋值给name
declare name varchar(20);
– 创建游标
declare 游标名称 cursor for 查询语句;
– 打开游标
open 游标名称;
– 对查询的结果集(即游标)进行检索行至变量提供使用
fetch 游标名称 into name;
select name;
– 关闭游标
close 游标名称;
end;
– 调用存储过程
call 存储过程名称;
–删除存储过程
drop procedure 存储过程名称;
3. 使用游标
1. 简单的使用游标
需求:查询oid
为1的订单明细名称的结果集作为游标
- 打开游标后抓取每行将结果赋值给变量
name
CREATE PROCEDURE printName()
BEGIN-- 订单名称DECLARE name VARCHAR(20);-- 创建游标DECLARE cur CURSOR FOR SELECT detail_name FROM order_detail WHERE oid = '1';-- 打开游标OPEN cur;FETCH cur INTO name;SELECT name;-- 关闭游标CLOSE cur;
END;
- 调用存储过程
CALL printName;
- 打印结果只有一条数据,说明上述方式只在游标中抓取到一条数据,而且是表里面行号最小的行:
2. 在循环中使用游标
- 将 查询oid为1 的结果集赋值给游标,通过游标抓取每行将订单明细名称和价格分别赋值给变量
name
和detail_price
,在循环无法继续时会出现SQLSTATE '02000'
,即此通过变量continue
时设置done
为1代表true
,此时循环结束,跳出循环:
DROP PROCEDURE IF EXISTS printDetail;
CREATE PROCEDURE printDetail()
BEGIN-- 订单名称DECLARE name varchar(20);-- 价格DECLARE detail_price DECIMAL(8,2);-- 结束标志变量(默认为假)DECLARE done boolean DEFAULT 0;-- 创建游标DECLARE cur CURSOR FOR SELECT detail_name, price FROM order_detail WHERE oid='1';-- 指定游标循环结束时的返回值DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;-- 打开游标OPEN cur;-- 循环游标数据detail_loop:LOOP-- 根据游标当前指向的一条数据FETCH cur INTO name, detail_price;SELECT name, detail_price;-- 判断游标的循环是否结束IF done THEN-- 跳出游标循环LEAVE detail_loop;END IF;END LOOP;-- 关闭游标CLOSE cur;
END;
- 调用存储过程:
CALL printDetail();
- 查询结果:(不足是会多遍历最后一行,如果要精细处理还是需要自定义标志位进行跳出循环)