游标

需求:创建一个存储过程,返回一条数据最为查询结果

-- 创建存储过程,返回查询到的一条图书信息
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;

测试

posted @ 2023-02-24 20:03  BattleTrumpet  阅读(105)  评论(0)    收藏  举报