mysql中游标的概念与使用

1 游标的概念

  • 虽然我们也可以通过筛选条WHERE和HAVING,或者是限定返回记录的关键字LIMIT返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。这个时候,就可以用到游标
  • 游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定
    位,并对指向的记录中的数据进行操作的数据结构。游标让SQL这种面向集合的语言有了面向过程开发的能力。
  • 在SQL中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,我们可以通过操作游标来对数据行进行操作。

2 游标的使用步骤

2.1 声明游标

#mysql、sqlserver、db2
declare cursor_name cursor for select_statement;
#oracle、postgreSQL
declare cursor_name cursor is select_statement;

2.2 打开游标

open cusor_name;

2.3 使用游标(从游标中获取数据)

fetch cursor_name into var_name[,var_name];
fetch cursor_name into emp_id,emp_sal;-- 与字段对应的变量

注意:游标的查询结果集中的字段数,必须跟INTO后面的变量数一致,否则,在存储过程执行的时候,MySQL会提示错误。

2.4 关闭游标

close cursor_name;

有OPEN就会有CLOSE,也就是打开和关闭游标。当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。

3 举例

select * from employees;

#举例:创建存储过程"get_count_by_limit_total_salary()",声明IN参数 limit_total_salary,
#DOUBLE类型:声明oUT参数total_count,INT类型。函数的功能可以实现累加薪资最高的几个员工的薪资值,
#直到薪资总和达到limit_total_salary参数的值,返回累加的人数给total_count。
create procedure get_count_by_limit_total_salary(in limit_total_salary double,out total_count int)
begin
	declare sum_sal double default 0.0;#薪资累计值
	declare emp_sal double;#每个员工的工资
	declare emp_count int default 0;#累加人数

	declare emp_cursor cursor for select salary  from employees order by salary desc;#1 声明游标
	open emp_cursor;#2 打开游标
	while sum_sal < limit_total_salary do#用循环控制游标取数据
		fetch emp_cursor into emp_sal;#3 使用游标
		set sum_sal = sum_sal + emp_sal;#累加薪资
		set emp_count = emp_count + 1;#记录人数
	end while;
	set total_count = emp_count;
	close emp_cursor;#4 关闭游标
end;
call get_count_by_limit_total_salary(120000,@sum_count);
select @sum_count;

4 小结

  • 游标是MySQL的一个重要的功能,为逐条读取结果集中的数据,提供了完美的解决方案。跟在应用层面实现相同的功能相比,游标可以在存储程序中使用,效率高,程序也更加简洁。
  • 但同时也会带来一些性能问题,比如在使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。
  • 建议:养成用完之后就关闭的习惯,这样才能提高系统的整体效率。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值