数据库中,对数据的处理分为两种方式:
一种是基于数据行集合的整体处理方式,直接使用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.gxlcms.com)!
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉
本文系统来源:php中文网