【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; |
+---------------------------------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值