什么是游标?游标的作用
游标实际上是一种控制数据集的更加灵活的处理方式。
游标提供了一种灵活的操作方式,让我们从数据结果集中每次提取一条数据记录进行操作。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。可以说,游标是面向过程的编程方式,这与面向集合的编程方式有所不同。
在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,我们可以通过操作游标来对数据行进行操作。
游标的使用
想要使用游标,一般需要经历五个步骤。
第一步,定义游标。
DECLARE cursor_name CURSOR FOR select语句
eg:
DECLARE cur_hero CURSOR FOR SELECT hp_max FROM heros;
第二步,打开游标。
OPEN cursor_name
第三步,从游标中取得数据。
FETCH cursor_name INTO var_name…
这句的作用是使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。
第四步,关闭游标。
CLOSE cursor_name
第五步,释放游标
DEALLOCATE cursor_name
DEALLOCATE 的作用是释放游标,如果不释放游标,游标会一直存在于内存中,直到进程结束后才会自动释放。
存储过程处理游标溢出:
当游标溢出时(也就是当游标指向到最后一行数据后继续执行会报的错误),我们可以定义一个 continue 的事件,指定这个事件发生时修改变量 done 的值,以此来判断游标是否已经溢出。同时在循环中我们需要加上对 done 的判断,如果游标的循环已经结束,就需要跳出 read_loop 循环
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
OPEN cur_hero;
read_loop:LOOP
FETCH cur_hero INTO hp;
IF done THEN
LEAVE read_loop;
END IF;
游标的应用场景
因为游标足够灵活,所以游标一般用来处理需要进行一些复杂的数据行计算的问题。但是使用游标也会带来性能问题,使用游标时会对数据加锁(为什么会加锁:在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用),这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,