游标
需求:创建一个存储过程,返回一条数据最为查询结果
-- 创建存储过程,返回查询到的一条图书信息
CREATE PROCEDURE proc_test1(IN id INT, out result VARCHAR(100))
BEGIN
DECLARE bname VARCHAR(20);
DECLARE bauthor VARCHAR(20);
DECLARE bprice DECIMAL(10,2);
select bookname,bookauther,bookprice INTO bname,bauthor,bprice from books where bookid = id;
set result = CONCAT_WS('~',bname,bauthor,bprice);-- 将三个字段值用~隔开,拼接成为字符串
END;
set @r = '';
call proc_test1(1,@r);
select @r from dual;

结果

游标
需求:创建一个存储过程,需要返回查询语句查询到的多条结果,该如何实现呢?
- 什么是游标?
相当于一个迭代器,游标可以用来依次取出结果集中的每一条数据,通过游标来获取每一条数据,相当于是一个临时对象,可以获取每一条属性
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);
-- 下面的查询语句执行之后返回的是结果集(多条记录),使用游标可以遍历查询的结果集
-- select bookname,bookauther,bookprice INTO bname,bauthor,bprice from books;-- 相较于上面,去掉了条件语句
-- 声明游标
DECLARE mycursor CURSOR FOR select bookname,bookauthor,bookprice from books;-- FOR用于使游标与查询语句产生关联
SELECT count(1) INTO num from books;
-- 打开游标
open mycursor;
-- 使用游标要结合循环语句
set i = 0;
while i < num DO
-- 提取游标当前指向的记录(提取之后,游标向下移动)
FETCH mycursor INTO bname,bauthor,bprice;-- FETCH是提取的意思
-- set str = CONCAT_WS('!',bname,bauther,bprice);或者
SELECT CONCAT_WS('~',bname,bauthor,bprice) INTO str;-- 调用函数CONCAT_WS,把每一条记录放在str中
set result = concat_ws(',',result,str);-- 再把每一条str拼接到result中
set i = i + 1;
end while;
-- 游标使用完毕后要关闭游标
CLOSE mycursor;
END;

- 游标的使用
- 1.声明游标语句:DECLARE <游标名称> CURSOR FOR <查询语句>;如,DECLARE cursor_name CURSOR FOR select bookname,bookauther,bookprice INTO bname,bauthor,bprice from books;
- 2.通过游标获取数据之前需要先打开游标
打开游标,语法:open <游标名字>,如,open mycursor; - 3.提取游标数据,FETCH mycurcor INTO bname,bauther,bprice;
- 4.关闭游标,CLOSE mycursor;
测试


浙公网安备 33010602011771号