什么是游标(光标)

类似光标的定位,用来逐行读取数据。

使用游标

游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。
如果我们想要使用游标,一般需要经历四个步骤。不同的 DBMS 中,使用游标的语法可能略有不同。
第一步,声明游标

  1. DECLARE 游标名 CURSOR FOR 查询语句;

第二步,打开游标
打开游标的时候 SELECT 语句的查询结果集就会送到游标工作区,为后面游标的逐条读取结果集中的记录做准备。

  1. OPEN 游标名

第三步,使用游标(从游标中取得数据)

  1. FETCH 游标名 INTO 变量名1 [, 变量名2] ...

这句的作用是使用 这个游标来读取当前行,并且将数据保存到 变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。
注意:对应的变量必须在声明游标之前就定义好。游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致
第四步,关闭游标

  1. CLOSE 游标名

例子

  1. DELIMITER //
  2. CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE,OUT total_count INT)
  3. BEGIN
  4. DECLARE sum_salary DOUBLE DEFAULT 0; #记录累加的总工资
  5. DECLARE cursor_salary DOUBLE DEFAULT 0; #记录某一个工资值
  6. DECLARE emp_count INT DEFAULT 0; #记录循环个数
  7. #定义游标
  8. DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
  9. #打开游标
  10. OPEN emp_cursor;
  11. REPEAT
  12. #使用游标(从游标中获取数据)
  13. FETCH emp_cursor INTO cursor_salary;
  14. SET sum_salary = sum_salary + cursor_salary;
  15. SET emp_count = emp_count + 1;
  16. UNTIL sum_salary >= limit_total_salary
  17. END REPEAT;
  18. SET total_count = emp_count;
  19. #关闭游标
  20. CLOSE emp_cursor;
  21. END //
  22. DELIMITER ;

总结

使用游标的过程中,会对数据行进行加锁,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足,这是因为游标是在内存中进行的处理。