SQL游标

  • Post author:
  • Post category:其他


什么是游标?游标的作用

游标实际上是一种控制数据集的更加灵活的处理方式。

游标提供了一种灵活的操作方式,让我们从数据结果集中每次提取一条数据记录进行操作。游标让 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 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用),这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,



版权声明:本文为shade7原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。