• 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

  • 相关阅读:
    stax(和dom4j功能一样,这个是基于流的一种处理方式)
    JAXB(xml和对象的转换)
    wsdl理解
    webservice心得
    ZT 分智网博客 – 职场、面试技巧、职业规划
    discern concern fifth sixth
    ZT I Believe I Can Fly(我相信我能飞)
    ZT 理解class.forName()
    ZT 第9章 Framework的启动过程
    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
  • 原文地址:https://www.cnblogs.com/--xiaoyao--/p/10985149.html
Copyright © 2020-2023  润新知