使用游标存储过程中

MySQL存储过程中使用游标

游标

游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

游标的特性

游标具有以下三个特性:

  • 不敏感(Asensitive)
    数据库可以选择不复制结果集
  • 只读(Read only)
  • 不滚动(Nonscrollable)
    游标只能向一个方向前进,并且不可以跳过任何一行数据

游标的优点

游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。

游标的缺点

游标的主要缺点是性能不高。游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。

游标的适用场景

MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。

使用步骤

  1. 定义游标:Declare 游标名称 CURSOR for table;(table也可以是select出来的结果集)
  2. 打开游标:Open 游标名称;
  3. 从结果集获取数据到变量:fetch 游标名称 into field1,field2;
  4. 执行语句:执行需要处理数据的语句
  5. 关闭游标:Close 游标名称;

示例

DELIMITER //CREATE PROCEDURE  Proc_ProcessClassInfo(in classUid varchar(36))BEGIN  /* 定义变量*/   DECLARE courseUid VARCHAR(36);   # 声明游标结束变量   DECLARE done INT DEFAULT 0;  /* 声明游标*/    DECLARE cur_list CURSOR FOR SELECT CourseUid  FROM class_course WHERE ClassUid=classUid;    /*游标中的内容执行完后将done设置为1 */  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    SET courseUid='';    /* 打开游标 */  OPEN cur_list;    /* 执行循环 */  read_loop : LOOP          /* 取游标中的值*/        FETCH cur_list INTO courseUid;                /* 判断是否结束循环,一定要放到FETCH之后,因为在fetch不到的时候才会设置done为1         如果放到fetch之前,先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次*/        IF done THEN            LEAVE read_loop;        END IF;                /*指定课件学习进度100%的内容*/                CALL Proc_ProcessCourseComplete(courseUid);                    END LOOP read_loop;  /* 释放游标 */  CLOSE cur_list;END //DELIMITER ;

变量声明Declare需要注意的地方:

  • Declare声明本地变量必须放在最前列
  • Declare一般是先声明本地变量,再是游标,然后是条件和handler
  • Declare声明的本地变量名称与声明的游标名称不能相同
上一篇:煮鸡蛋时 开水 冷水下锅都不对 牢记这5点 轻轻一碰就脱壳
下一篇:蘑菇不熟吃了有毒吗 蘑菇没煮熟会中毒吗