MySQL 游标
注:未经过,本文作者允许,严禁转载
MySQL 游标概念:游标可以用来依次取出查询结果集中的每一条数据(逐条读取,结果集中的每一条记录)
游标的使用步骤
-
声明游标语法 1
-- DECLARE 游标名称 CURSOR FOR SQL查询语句; DECLARE cursor_name CURSOR FOR select_statement;
-
打开游标语法 2
-- 打开游标 -- OPEN 游标名称; OPEN cursor_name;
-
使用游标语法 3
-- 使用游标结合循环语句一起使用 -- 使用游标(提取游标当前指向的数据)之后往下移动 -- FETCH 游标名称 INTO 变量1,变量2...; FETCH cursor_name INTO bname,bauthor,bprice;
-
关闭游标语法 4
-- 关闭游标 -- CLOSE 游标名称; CLOSE cursor_name;
例子:
-- 创建一个存储过程:返回查询结果集的图书信息
DELIMITER $$
CREATE PROCEDURE proc_test1(OUT result VARCHAR(200))
BEGIN
DECLARE bname VARCHAR(20);
DECLARE bauthor VARCHAR(20);
DECLARE bprice DECIMAL(10,2);
-- 定义变量
DECLARE num INT;
DECLARE i INT;
DECLARE str VARCHAR(50);
-- 该查询的 SQL 语句返回的是一个结果集(多条记录)
-- 此处可以使用 MySQL 提供的游标来遍历查询结果集
-- 声明游标语法:DECLARE 游标名称 CURSOR FOR SQL查询语句;
DECLARE my_cursor CURSOR FOR SELECT book_name,book_author,book_price FROM books;
SELECT COUNT(1) INTO num FROM books;
-- 打开游标
-- OPEN 声明游标名称
OPEN my_cursor;
-- 使用游标结合循环语句一起使用
SET i=0;
WHILE i<num DO
-- 从游标获取字段值,并且赋值给 bname,bauthor,bprice 这三个变量
-- 使用游标(提取游标当前指向的数据)之后往下移动
FETCH my_cursor INTO bname,bauthor,bprice;
-- CONCAT_WS('~',bname,bauthor,bprice):bname,bauthor,bprice 以波浪线进行拼接
-- 以下两种写法意思都是差不多的
-- 写法1:set str=concat_ws('~',bname,bauthor,bprice);
-- 写法2:SELECT CONCAT_WS('~',bname,bauthor,bprice) INTO str;
-- 每一条记录放在 str 变量里
SELECT CONCAT_WS('~',bname,bauthor,bprice) INTO str;
-- 多条记录放在 result 中
SET result=CONCAT_WS(',',result,str);
SET i=i+1;
END WHILE;
-- 关闭游标
CLOSE my_cursor;
END $$
创建没问题,接下来测试以下,能不能通过游标查询出多条信息呢!
-- 测试游标
SET @r='';
CALL proc_test1(@r);
SELECT @r FROM DUAL;