mysql 游标的使用
游标是什么??
游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。
使用游标
在介绍如何创建游标之前,先说明下如何使用游标。
使用游标涉及几个明确的步骤。
1、在能够使用游标前,必须先定义它。这个过程实际上是没有检索数据的,它只是定义要使用的select语句。
2、一旦你定义了游标后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。即这个步骤之后,我们就可以操作游标中的数据了。
3、对于有数据的游标,根据需要取出各行的数据来进行一定的操作。
4、使用完游标后,一定要关闭游标。
创建游标
创建一个游标的语法如下:
用declare 来定义,具体如下:
上面是定义游标的一般形式,当我们定义了一个游标之后,我们就可以来打开它、使用它、关闭它。
打开游标:
open cursor_name;
关闭游标:
close cursor_name;
使用游标:
使用游标用fetch来取出数据,例如:fetch cursor_name in variable;//取出游标所指示的数据给局部变量variable
下面这个例子就是演示了创建一个游标,打开游标及关闭游标,但没有对游标所指示的数据进行数据。
实例:操作游标中的数据
需求是这样,我们手上有一个student2表,表中的结构和数据如下:
现在我们需要将student2表中所有学生的的平均成绩(mathScore+englishScore的一半)合成一行,用逗号’,’隔开。
对于这样一个需求,下面我们尝试用游标来实现。
DELIMITER $$ CREATE
PROCEDURE `test`.`procedure_student2`()
BEGIN
-- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。
DECLARE val DOUBLE DEFAULT 0;
DECLARE tempRes VARCHAR(10) DEFAULT '';
DECLARE res VARCHAR(100) DEFAULT '' ;
-- declare a cursor
DECLARE cursor_avgScore CURSOR
FOR
SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2;
-- declare a continue handler ,use finish while loop
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET val= -1.0 ;
-- open cursor
OPEN cursor_avgScore ;
FETCH cursor_avgScore INTO val;
-- fetch cursor
WHILE val!=-1 DO
SET tempRes=CONCAT(val,', ');
SET res=CONCAT(res,tempRes);
FETCH cursor_avgScore INTO val;
END WHILE;
-- close cursor
CLOSE cursor_avgScore ;
-- 显示结果
SELECT res;
END$$ DELIMITER ;
调用此存储过程
CALL procedure_student2();
运行结果如下:
上面这个是利用了while循环来一个一个的获取游标中的数据,在MySQL中我们还可以用repeat来做。
DELIMITER $$ CREATE
PROCEDURE `test`.`procedure_student_v1`()
BEGIN
-- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。
DECLARE val DOUBLE DEFAULT 0;
DECLARE tempRes VARCHAR(10) DEFAULT '';
DECLARE res VARCHAR(100) DEFAULT '' ;
-- declare a cursor
DECLARE cursor_avgScore CURSOR
FOR
SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2;
-- declare a continue handler ,use finish while loop
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET val= -1.0 ;
-- open cursor
OPEN cursor_avgScore ;
-- fetch cursor
REPEAT
FETCH cursor_avgScore INTO val;
IF val!=-1 THEN
SET tempRes=CONCAT(val,', ');
SET res=CONCAT(res,tempRes);
END IF;
UNTIL val=-1 END REPEAT; -- 居然MySQL中 用 val=-1 来结束循环,原以为应该和java、c类似,用val==-1来结束。
-- close cursor
CLOSE cursor_avgScore ;
-- 显示结果
SELECT res;
END$$ DELIMITER ;
转自:http://blog.csdn.net/u010412719/article/details/51125496
mysql 游标的使用的更多相关文章
- SqlServer和MySQL游标学习
一 sqlserver游标使用 /*** 游标的使用 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱. 使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...
- MySQL游标操作指南
本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下 测试表 level 代码如下: create table test.level (name varchar(20)); ...
- 个人笔记mysql游标
经过测试,mysql游标是无法读取自定义函数计算的结构,mysql自带的函数计算值是可以读取的.
- MySQL游标的简单实践
Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...
- mysql 游标 demo
一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...
- [转]MySQL游标的使用
转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的S ...
- Mysql 游标初识
MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...
- MySQL 游标
概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...
- Mysql游标的简明写法
-- cursor 游标/*declare 声明; declare 游标名 cursor for select_statement;open 找开; open 游标名fetch 取值; fetch 游 ...
- MySQL游标循环取出空值的BUG
早上同事要我写个MySQL去除重复数据的SQL,想起来上次写过一篇MySQL去除重复数据的博客,使用导入导出加唯一索引实现的,但是那种方式对业务影响较大,所以重新写一个存储过程来删重复数据,这一写就写 ...
随机推荐
- hdu 1285 确定比赛名次 (拓扑)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- LeetCode -- Best Time to Buy and Sell Stock系列
Question: Best Time to Buy and Sell Stock Say you have an array for which the ith element is the pri ...
- ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算 ...
- 安徽师大附中%你赛day4T1 金字塔 解题报告
金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...
- 工具——代码中自动生成SVN版本号
本节和大家讨论一下程序集版本最后一位使用SVN版本号的自动生成方法,这里就向大家简单介绍一下.在进行自动部署的时候,经常需要用脚本获取程序的最新版本号.现在我们定义每个程序集的版本信息的最末段表示SV ...
- Mybatis LIKE模糊查询
1.在代码中拼接好字符串后传入进来 2.使用CONCAT在xml中拼接字符串: <if test="queryParam.keyword != null"> AND b ...
- mysql_存储过程和函数
存储过程和函数 1.什么是存储过程和函数 存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对 ...
- HTML5学习之新增标签
转自:http://www.cnblogs.com/fly_dragon/archive/2012/05/25/2516142.html 作者:FlyDragon 一.引言 在本节中,笔者将向大家讲述 ...
- 微信小程序基础知识
一.基本目录结构 app.js 定义app入口 app.json 定义页面配置 index.js 页面中的事件和监听 index.wxml 定义布局文件 1.app.json配置基本信息 { “pag ...
- Maven环境搭建、调试、打包
1.配置Maven环境 将下载文件解压,然后设置maven环境 新建环境变量M2_HOME 变量名:M2_HOME 变量值:F:\maven\apache-maven-3.0.3 追加path环境变量 ...