本文实例讲述了MySQL游标概念与用法。分享给大家供大家参考,具体如下:

1、游标的概念(Cursor)

一条sql,对应N条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行。如果开发过安卓的同学应该知道有一个Api是Cursor,也是读取SQLite数据库用的,和这个有点类似。

2、使用游标的步骤

(1)声明

使用declare进行声明

declare 游标名 cursor for select_statement

(2)打开游标

使用open进行打开

open 游标名

(3)从游标中取值

使用fetch进行取值

fetch 游标名 into var1,var2[,...] --将取到的一行赋值给多个变量

(4)关闭游标

使用close关闭游标

close 游标名

3、创建一个简单的游标

需求:从商品表中读取第一行数据

商品表(goods)数据:

注意:我这里已经将MySQL的结束标识符改为 $,如果要知道怎么设置为$,请参考前面一篇文章:MySQL触发器。

定义:

create procedure p12()

begin

/*定义三个变量用于存放商品id,商品名称,商品库存量*/

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare getgoods cursor for select gid,name,num from goods; --定义游标

open getgoods; --打开游标

fetch getgoods into row_gid,row_name,row_num;--从游标中取值

select row_name,row_num; --显示操作

close getgoods; --关闭游标

end$

输出结果:

4、多次取值操作

create procedure p13()

begin

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare getgoods cursor for select gid,name,num from goods;

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

close getgoods;

end$

输出:

注意:当游标读到末尾,如果继续进行取值操作会发生报错

5、游标循环表中的所有数据

(1)使用计数器来循环

create procedure p14()

begin

declare cnt int default 0;

declare i int default 0;

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare getgoods cursor for select gid,name,num from goods;

select count(*) into cnt from goods;

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

set i:= i+1;

until i >= cnt end repeat;

close getgoods;

end$

输出结果:

(2)使用越界标志来控制循环

在mysql cursor中,可以声明declare continue handler来操作1个越界标志

语法:

declare continue handler for NOT FOUND statement;

使用:

create procedure p15()

begin

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods;

declare continue handler for NOT FOUND set have:= 0;

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

输出结果:

注意:这里发生了错误,这里输出了4行数据,而表中只有3行数据,而且还爆出了警告,后面会说怎么结果这个问题。

程序执行逻辑:

循环游标->fetch第三条数据->显示->fetch第四条数据->没有数据->设置have=0操作->执行continue Handler->程序不退出,执行显示操作->还是显示第三条数据

6、continue和exit的区别

continue:若没有数据返回,程序继续,并将变量IS_FOUND设为0,这种情况是出现在select XX into XXX from tablename的时候发生的。

exit:若没有数据返回,退出程序,并将变量IS_FOUND设为0,这种情况是出现在select XX into XXX from tablename的时候发生的。

使用exit来替换continue:

使用exit就不会出现上面的那种情况了,程序执行逻辑:

循环游标->fetch到第三条数据->显示->第四次fetch操作->没有数据->设置 have=0操作->程序直接退出exit

所以就没有显示出第四条数据。

create procedure p16()

begin

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods;

declare exit handler for NOT FOUND set have:= 0;

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

输出结果:

7、正确的游标循环

在一些特殊的情况中,我们可以读到的数据为空,或者压根sql语句就有错误,我们不能避免出现这种情况,所以我们要正确的使用游标循环操作。

首先应该创建游标,然后打开游标后,应先手动进行fetch操作获取到一行数据,然后再通过循环,在循环里先做处理内容,后进行fetch操作。这样如果在手动获取数据的期间就没有获得到数据的话,就会执行have = 0,如果是repeat循环,然后进入repeat循环,先输出null数据,最后又进行获取,这样运行到until时就会退出循环;如果是while循环,压根就不进去while循环里,就不会有任何1行输出。

(1)repeat循环:

create procedure p17()

begin

declare row_gid int;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods where 0;

declare continue handler for NOT FOUND set have:= 0;

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

repeat

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

输出结果:

(2)while循环:

create procedure p18()

begin

declare row_gid int;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods where 0;

declare continue handler for NOT FOUND set have:= 0;

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

while have = 1 do

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

end while;

close getgoods;

end$

输出结果:

希望本文所述对大家MySQL数据库计有所帮助。

mysql游标_MySQL游标概念与用法详解相关推荐

  1. python装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  2. mysql 从第几位开始截取_mysql的截取函数用法详解

    原标题:mysql的截取函数用法详解 substring()函数 测试数据准备: 用法: 以下语法是mysql自动提示的 1:substirng(str,pos):从指定位置开始截取一直到数据完成 s ...

  3. mysql 创建游标报错,MySQL游标概念与用法详解

    本文实例讲述了mysql游标概念与用法.分享给大家供大家参考,具体如下: 1.游标的概念(cursor) 一条sql,对应n条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行.如果开发过安卓 ...

  4. python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解

    本文实例讲述了python数据库操作mysql:pymysql.sqlalchemy常见用法.分享给大家供大家参考,具体如下: 相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 ...

  5. mysql 遍历_MySQL 实现树的遍历详解及简单实现示例

    MySQL 实现树的遍历 经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到树的遍历.在Oracle 中可以使用connect by简单解决问题,但MySQL 5. ...

  6. 【Golang画图】2D渲染绘图库gg的概念与用法详解(一)

    文章目录 概述 基本使用 基本概念 基本底层操作 具体操作: 示例1:画圆 示例2:画带边框的矩形 示例3:贴图片文件 示例4:贴文字 示例5:半透明+缩放贴图 备注 概述 最近的项目中需要用代码来手 ...

  7. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  8. 组合索引mysql语句_Mysql之组合索引方法详解

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...

  9. mysql in边界_mysql中 where in 用法详解

    这里分两种情况来介绍 WHERE column IN (value1,value2,...) WHERE column NOT IN (value1,value2,...) 1.in 后面是记录集,如 ...

最新文章

  1. depot用例视图建模
  2. 近 100 场专题演讲、14 大沉浸式应用场景…别不信!这是真·烧脑技术盛会
  3. Git 命令行的使用
  4. linux redis安装报错,Linux安装Redis实现过程及报错解决方案
  5. html中单选框颜色怎么改,如何更改单选按钮的颜色?
  6. 博客园自动添加版权说明,自动添加文章链接
  7. linux rcu机制,Linux RCU机制详解 (透彻)
  8. socket端口重定向(python示例)
  9. 替代传统按键方案 单通道感应TTP223E-BA6 TTP223E-CA6 TTP223E-HA6 单按键触摸检测IC
  10. Linux内核时间管理和定时器
  11. ue4 android 插件,基于ijkplayer封装的UE4安卓播放器插件
  12. 专科学历事业单位工资计算机,【事业单位工资标准表】 事业单位学历工资标准...
  13. 第7章第32节:五图排版:五张图片并列排版 [PowerPoint精美幻灯片实战教程]
  14. Linux中如何添加自己的路径到PATH
  15. html载入3d模型,webGL3D模型的加载与使用
  16. 关于快排算法的基本实现
  17. android+iphone+共用字体,【报Bug】苹果和安卓手机 字体大小颜色字重都一样 效果却不同...
  18. react 实现banner轮播效果
  19. Camera elements
  20. 餐饮美食菜品推荐数据表

热门文章

  1. python字符串输入_Python输入字符串的方法和实例代码
  2. 字节跳动国际化电商日常实习面经汇总(一二三四面 已OC)
  3. word快捷键大集合
  4. UVA11988 破损的键盘
  5. 《FFmpeg Basics》中文版-10-为视频添加文字
  6. Python算法——对数组进行循环移位
  7. 学习笔记:matlab查看彩色图像的各个通道
  8. ES数据库的搭建(包含踩坑记录)
  9. 一、Docker 简介与安装
  10. js判断是否是数组的方式