mysql-游标

游标

游标只能用于存储过程内, 且具有如下三个属性

  • 敏感: 服务端可能会做其关联表结果的副本,也能不会做其关联表结果的副本.
  • 只读: 游标的数据不可更改
  • 不可回滚: 只能朝一个方向前进,不能跳跃前进,也不可以回退

游标声明

DECLARE cursor_name CURSOR FOR select_statement  
  • cursor_name 游标名称 同一个语句块内必须唯一
  • select_statement 游标关联的查询语句或结果集 查询语句中不能使用into子句法. 另select取的列数应与fetch into对应的列数一致

游标的声明必须出现在条件处理声明之前, 变量和条件声明之前

打开游标

OPEN cursor_name

取游标数据

FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...

取游标关联的结果集中的下一行数据, 执行该语句时, 游标必须被打开. 如果下一行存在数据则数据值会被存在指定的变量中, 若下一行没有数据,则会触发SQLSTATE值为'02000'或NOT FOUND的条件处理.

  • cursor_name 游标名
  • var_name 存数据的变量名 数量应与select选择的列数一致

关闭游标

CLOSE cursor_name

此语句时关闭之前打开的游标, 如果游标没有被打开将会出错, 没哟显示关闭将会在所在BEGIN...END结束后关闭

示例

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;
  OPEN cur2;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP;

  CLOSE cur1;
  CLOSE cur2;
END;

参考

https://dev.mysql.com/doc/refman/5.7/en/cursors.html

原文地址:https://www.cnblogs.com/--xiaoyao--/p/10985149.html