游标是什么??

游标是一个存储在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 游标的使用的更多相关文章

  1. SqlServer和MySQL游标学习

    一 sqlserver游标使用 /*** 游标的使用  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱.  使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...

  2. MySQL游标操作指南

    本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下   测试表 level  代码如下: create table test.level (name varchar(20)); ...

  3. 个人笔记mysql游标

    经过测试,mysql游标是无法读取自定义函数计算的结构,mysql自带的函数计算值是可以读取的.

  4. MySQL游标的简单实践

    Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...

  5. mysql 游标 demo

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

  6. [转]MySQL游标的使用

    转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的S ...

  7. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

  8. MySQL 游标

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

  9. Mysql游标的简明写法

    -- cursor 游标/*declare 声明; declare 游标名 cursor for select_statement;open 找开; open 游标名fetch 取值; fetch 游 ...

  10. MySQL游标循环取出空值的BUG

    早上同事要我写个MySQL去除重复数据的SQL,想起来上次写过一篇MySQL去除重复数据的博客,使用导入导出加唯一索引实现的,但是那种方式对业务影响较大,所以重新写一个存储过程来删重复数据,这一写就写 ...

随机推荐

  1. [剑指Offer] 23.二叉搜索树的后序遍历

    [思路]BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两 ...

  2. error C3872: '0x3000': this character is not allowed in an identifier 解决方法

    文章参考地址:http://blog.csdn.net/danxuezx/article/details/5096497 编译时遇到这个错误多半是从网上拷贝一段代码到VS里然后编译时产生的,这是因为拷 ...

  3. 如何优化JQuery each()函数的性能

    如果对jQuery这东西只停留在用的层面,而不知其具体实现的话,真的很容易用出问题来.这也是为什么近期我一直不怎么推崇用jQuery,这框架的API设定就有误导人们走上歧途之嫌. 01 $.fn.be ...

  4. PHP 5.4语法改进与弃用特性

    PHP 5.4于本月尘埃落定,它是 PHP 自 2009 年以来的首次重大更新.该版本对语言部分进行了增强,包括支持 Traits 和移除部分争议特性. Traits 同 Java 和 .NET 一样 ...

  5. 如何配置开源中国Maven库以加快依赖包下载速度

    有时有某些地方由于网络问题,访问maven主仓库比较慢,甚至有可能无法下载某些jar包,此时可以把开源中国Maven库配置到settings.xml文件中,加快依赖包的下载速度. 具体如何配置? 在m ...

  6. vue文件使用stylus报错问题

    先npm install stylus --save然后安装你少的page.json中依赖:npm install stylus-loader css-loader style-loader --sa ...

  7. [CVPR2017]Online Video Object Segmentation via Convolutional Trident Network

    基于三端卷积网络的在线视频目标分割 针对半监督视频目标分割任务,作者采取了和MaskTrace类似的思路,以optical flow为主. 本文亮点在于: 1. 使用共享backbone,三输出的自编 ...

  8. POST提交数据太大

    2018.4.8号更新 其实后来最终的解决方案是修改服务器的配置文件. POST数据按道理说是没有大小限制的,只是取决于浏览器或服务器的配置,tomcat的解决方式参考方案2. ----------- ...

  9. Python基础(8)迭代器、生成器

    一 什么是迭代 1 重复 2 下一次重复是基于上一次的结果 # while True: # cmd=input('>>: ') # print(cmd) # l=['a','b','c', ...

  10. JVM内存模型 二

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...