【MySQL 10】游标
来源:互联网 发布:js validate 验证 编辑:程序博客网 时间:2024/04/30 04:23
数据库中,对数据的处理分为两种方式:
一种是基于数据行集合的整体处理方式,直接使用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; |+---------------------------------+
0 0
- 【MySQL 10】游标
- Mysql 游标
- mysql 游标
- MySQL游标
- mysql 游标
- MySQL游标
- mysql游标
- mySQL游标
- mysql游标
- MySQL游标
- mysql游标
- MySQL游标
- MYSQL游标
- MySQL游标
- Mysql游标
- MySQL游标
- mysql 游标
- MySQL游标
- lucence 示例 (三)
- 第三章pmtest2源码解析 实模式到保护模式再到实模式
- codeforces 711D Directed Roads(DFS)
- ios developer tiny share-20160901
- Ubuntu下安装 starUML
- 【MySQL 10】游标
- 斐波那契高效算法(4种算法综合分析)
- git创建版本库
- 虚拟机VMware下CentOS桥接(VMnet0)连外网
- Bundles of Joy
- POJ3041最小点覆盖
- 欢迎使用CSDN-markdown编辑器
- lucence 索引篇(四)
- tjut 3564