【MySQL 10】游标

数据库中,对数据的处理分为两种方式: 
      一种是基于数据行集合的整体处理方式,直接使用select、update、delete等语句来操作(select语句直接查询某一整列); 
       一种是逐行处理数据行的方式,游标就是这种数据访问机制,允许用户一次访问单个数据行,而非整个数据行集(游标在某一列中进行一行一行查询)。

一、创建数据表

mysql> select * from person;  +----+------+------+------+-----------+| id | name | sex  | age  | addr      |  +----+------+------+------+-----------+|  1 | Jone | fema |   27 | xianggang |  |  2 | Lily | fema |   25 | taiwan    |  |  3 | Bobe | male |   25 | ximan     ||  4 | Kity | fama |   20 | beijing   |  +----+------+------+------+-----------+

查询person数据表中的addr列,使得结果以这种形式输出: 
xianggang;taiwan;ximan;beijing;

二、查询

方式1:

drop procedure if exists useCursor ;delimiter //CREATE PROCEDURE useCursor() # 创建一个存储过程  BEGIN      DECLARE oneAddr varchar(20) default '';    # 定义一个变量oneAddr      DECLARE allAddr varchar(80) default '';    # 定义一个变量allAddr      DECLARE curl CURSOR FOR SELECT addr FROM person.person; # 定义一个游标curl      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null;   # 如果没有数据返回,就将变量oneAddr设置为null      # 也可以这么写      # DECLARE CONTINUE HANDLER FOR NOT FOUND SET oneAddr = null;      OPEN curl;  # 打开游标      FETCH curl INTO oneAddr;   # 通过游标读取数据    WHILE(oneAddr is not null) DO    # 使用 while...do 循环来遍历 addr 列        set oneAddr = CONCAT(oneAddr, ';');        set allAddr = CONCAT(allAddr, oneAddr);        FETCH curl into oneAddr;    END WHILE;      CLOSE curl; # 关闭游标    SELECT allAddr;      END;//call useCursor();

方式2:

drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor()    BEGIN      DECLARE oneAddr varchar(20) default '';      DECLARE allAddr varchar(80) default '';      DECLARE done INT DEFAULT 0; # 定义一个默认值0      DECLARE curl CURSOR FOR SELECT addr FROM person.person;      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;      OPEN curl;    REPEAT  # 使用repeat循环来遍历addr列        FETCH curl INTO oneAddr;      IF NOT done THEN          set oneAddr = CONCAT(oneAddr, ';');          set allAddr = CONCAT(allAddr, oneAddr);      END IF;    UNTIL done END REPEAT; #直到为0才结束循环      CLOSE curl;    select allAddr;  END;//call useCursor();

方式3:

drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor()    BEGIN      DECLARE oneAddr varchar(20) default '';      DECLARE allAddr varchar(80) default '';      DECLARE done bool DEFAULT false; # 定义布尔变量,默认值为false      DECLARE curl CURSOR FOR SELECT addr FROM person.person;      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;      OPEN curl;      personLoop: LOOP  #使用loop循环来遍历addr列        FETCH curl INTO oneAddr;      IF done THEN          LEAVE personLoop;      ELSE          set oneAddr = CONCAT(oneAddr, ';');          set allAddr = CONCAT(allAddr, oneAddr);      END IF;    END LOOP personLoop;      CLOSE curl;    select allAddr;  END;//call useCursor();

三、输出结果

mysql> call useCursor();//  +---------------------------------+| allAddr                         |  +---------------------------------+| xianggang;taiwan;ximan;beijing; |  +---------------------------------+

以上就是 【MySQL 10】游标的内容,更多相关内容请关注PHP中文网(www.php.cn)!

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享