MySQL 游标概念:游标可以用来依次取出查询结果集中的每一条数据(逐条读取,结果集中的每一条记录)
游标的使用步骤
声明游标语法 1
DECLARE cursor_name CURSOR FOR select_statement;
打开游标语法 2
OPEN cursor_name;
使用游标语法 3
-- 使用游标结合循环语句一起使用
-- 使用游标(提取游标当前指向的数据)之后往下移动
-- FETCH 游标名称 INTO 变量1,变量2...;
FETCH cursor_name INTO bname,bauthor,bprice;
关闭游标语法 4
-- 关闭游标
-- CLOSE 游标名称;
CLOSE cursor_name;
例子:
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;