MySQL检所操作返回一组称为结果集的行,游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。只能用于存出过程

  1. 声明(定义)游标,这个过程没有实际的检索数据,只是定义使用的select语句。
  2. 打开游标,用前面定义的select语句把数据检索出来
  3. 用于填有数据的游标,根据需要检索出各行。
  4. 游标使用结束时关闭游标。

声明游标

DECLARE cursor_avgScore CURSOR

打开游标

OPEN cursor_avgScore ;

关闭游标

CLOSE cursor_avgScore ;

  close使用游标所使用的内部内存和资源,因此游标不使用时要关闭。

  一个关闭后的游标不打开不能再次使用,但是一个声明后的游标不需要再次声明,用open打开就可以。

有一个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 ;

在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 ;

MySQL中while,loop,repeat循环

-- MySQL中的三中循环 while 、 loop 、repeat  求  1-n 的和

-- 第一种 while 循环
-- 求 1-n 的和
/* while循环语法:
while 条件 DO
循环体;
end while;
*/
-- 实例:
create procedure sum1(a int)
begin
declare sum int default 0; -- default 是指定该变量的默认值
declare i int default 1;
while i<=a DO -- 循环开始
set sum=sum+i;
set i=i+1;
end while; -- 循环结束
select sum; -- 输出结果
end
-- 执行存储过程
call sum1(100);
-- 删除存储过程
drop procedure if exists sum1 -- 第二种 loop 循环
/*loop 循环语法:
loop_name:loop
if 条件 THEN -- 满足条件时离开循环
leave loop_name; -- 和 break 差不多都是结束训话
end if;
end loop;
*/ -- 实例:
create procedure sum2(a int)
begin
declare sum int default 0;
declare i int default 1;
loop_name:loop -- 循环开始
if i>a then
leave loop_name; -- 判断条件成立则结束循环 好比java中的 boeak
end if;
set sum=sum+i;
set i=i+1;
end loop; -- 循环结束
select sum; -- 输出结果
end
-- 执行存储过程
call sum2(100);
-- 删除存储过程
drop procedure if exists sum2 -- 第三种 repeat 循环
/*repeat 循环语法
repeat
循环体
until 条件 end repeat;
*/ -- 实例;
create procedure sum3(a int)
begin
declare sum int default 0;
declare i int default 1;
repeat -- 循环开始
set sum=sum+i;
set i=i+1;
until i>a end repeat; -- 循环结束
select sum; -- 输出结果
end -- 执行存储过程
call sum3(100);
-- 删除存储过程
drop procedure if exists sum3

MySQL使用游标的更多相关文章

  1. MySQL中游标使用以及读取文本数据

    原文:MySQL中游标使用以及读取文本数据 前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试 ...

  2. MySQL存储过程 游标

    MySQL存储过程  游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...

  3. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  4. MySql使用游标Cursor循环(While)更新数据

    #要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...

  5. MySql 中游标,事务,终止存储过程方法总结

    最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到 ...

  6. 用 Navicat 写mysql的游标

    千言万语也比不上一个简单直接明了的小例子: CREATE PROCEDURE pro_users() begin DECLARE myid int; DECLARE no int; ); ); ); ...

  7. 【MySQL】游标的具体使用详解

    测试表 level ; )); 再 insert 些数据 ;代码,初始化 drop procedure if exists useCursor // 建立 存储过程 create CREATE PRO ...

  8. mysql之游标

    游标 行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们).有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标( cursor)是一个存储在MySQL服务器上的数 ...

  9. MySql命令——游标

    1.游标的概念 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标(cursor)是一个存储在 MySql 服务器上的数据库查询,它不是一条 select 语句,而是被该语句检 ...

  10. mysql 简单游标

    <=====================MYSQL 游标示例=====================> CREATE PROCEDURE `test`.`new_procedure` ...

随机推荐

  1. 「版本升级」MyEclipse CI 2018.12.0正式发布

    新版本MyEclipse为WildFly 14新增一个新的服务器连接器,改进性能并新增一些Java 10修复程序.新版本为IDE做了几个核心修复,这是MyEclipse 2018一个更棒的升级. [M ...

  2. vue2+webpack 开发环境配置

    前提条件: 1.安装node.js https://nodejs.org/en/ 下载安装合适的平台 2.安装npm 第一步:初始化项目 新建文件夹 E:\app 推荐vue项目目录结构: confi ...

  3. EF6增改删等常用基类

    using System; using System.Linq; using System.Threading.Tasks; using System.Linq.Expressions; using ...

  4. MySql:触发器

    触发器 一.触发器的定义: 触发器是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定的事件发生时,就会被M ...

  5. mysql cast

    之前讲到了orcale的字符串与日期等类型的转换,现在我们来看看Mysql是怎么转换的.比起orcale,MySQL相比之下就简单得多了,只需要一个Cast()函数就能搞定.其语法为:Cast(字段名 ...

  6. python生产者消费者模型优点

    生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...

  7. vue学习--自定义全局vue组件

    文档目录: |--components |-loading(组件文件夹) |-loading.vue (loading组件核心) |-index.js //配置导出组件,并且install 主要配置到 ...

  8. [转]TDD之Dummy Stub Fake Mock

    TDD之Dummy Stub Fake Mock 测试驱动大家都很熟悉了,这两天正好看了一个java的书,对TDD中的一些基本概念进行了复习,具体如下: Dummy An object that is ...

  9. Java中的参数列表

    一. 什么是参数列表 当你在编写一个函数时,你不知道函数形参的类型或者是形参的长度时,你就可以使用参数列表来代替. 样式: public void f(Object...objects) { Syst ...

  10. maven初级

    ANT 和 分布式 ANT 是一种构建工具,就是eclips中项目,建立,删除..等等都是. 高负载访问一个服务器的时候,服务器会出现卡机或者访问速率降低的问题,这个时候就需要分布式的使用,将一个项目 ...