MySQL-游标

MySQL-游标

起男 1,403 2021-01-04

MySQL-游标

定义

游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集

作用

比如有这么个语句

select name,age from persion where age > 10;

这个语句返回的可能是多条结果,那么该如何遍历每一条数据呢,这个时候就需要游标,游标可以理解成java的List<Object>集合,存储了每一个含有“name”和“age”的对象。接下来我们就可以遍历集合中每一个对象获取“name”和“age”

使用

  • 声明游标:这个过程实际上是没有遍历的数据,它只是定义要使用的select语句来获取数据
  • 打开游标:上面定义好后,那么这里就需要打开游标。这个过程用全面定义的select语句把数据实际检索出来。即这个步骤之后,我们就可以遍历游标中的数据了
  • 遍历数据:对于有数据的游标,根据需要取出各行的数据来进行一定的操作
  • 关闭游标:使用完游标后,一定要关闭游标

语法

声明游标

declare cursor_name cursor for select_statement;

这个语句声明一个游标,也可以在子程序中定义多个游标。也可以在子进程中定义多个游标,但是一个块中的每一个游标必须有唯一的名字。声明游标后也是单条操作的,但是select语句不能有into子句

打开游标

open cursor_name;

这个语句打开先前声明的游标

遍历数据

fetch cursor_name into var_name;

这个语句用指定的打开的游标读取下一行(如果有下一行的话,并且前进游标指针)

关闭游标

close cursor_name;

案例

delimiter //
create procedure proc()
begin 
	-- 接收游标数据的变量
	declare a int(10);
	declare b varchar(10);
  	-- 结束标识
	declare done int default false;
	-- 游标
	declare c1 cursor for select id,mag from t_aaa;
	-- 修改结束标识
	declare continue handler for not found set done = true;

	-- 打开
	open c1;
	-- 遍历
	ll:loop 
		fetch c1 into a,b;
		select a,b;
		-- 结束循环
		if done then 
			leave ll;
		end if;
	end loop;
	-- 关闭游标
	close c1;
end //
delimiter ;
  • fetch:是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行的时候继续执行会造成游标溢出
  • declare continue handler for not found set done = true:在MySQL中,造成游标溢出时会引发MySQL预定义的not found错误,所有在上面使用了该代码,当引发了not found错误时定义一个continue的事件,指定这个事件发生时修改done变量的值

原文:https://www.cnblogs.com/qdhxhz/p/10818375.html