您好,欢迎访问一九零五行业门户网

【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】游标的内容。
其它类似信息

推荐信息