数据库中,对数据的处理分为两种方式:
一种是基于数据行集合的整体处理方式,直接使用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】游标的内容。