本篇文章小编给大家分享一下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. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  2. mysql 删除原理_MySQL权限原理及删除MySQL的匿名账户

    MySQL权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证,不合法的用户拒绝连接: (2)对通过认证的合法用户赋予相应的权限,用户可 ...

  3. mysql in 有序_mysql中的in排序 mysql按in中顺序来排序

    假设,有如下的sql语句: 复制代码 代码示例: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3, ...

  4. mysql手机版_Mysql管理安卓版下载-Mysql管理appv1.4 最新版-腾牛安卓网

    Mysql管理app,手机上可以连接Mysql了.这是一个免费的数据库管理助手,数据表随时查看,使用Mysql也更加简单了哦,有需要的快来下载. Mysql管理: 一款小工具应用,手机上的Mysql连 ...

  5. mysql 关闭in自动排序,mysql排序语句_mysql中的in排序 mysql按in中顺序来排序

    摘要 腾兴网为您分享:mysql中的in排序 mysql按in中顺序来排序,易订货,虚拟按键,享家,顺丰小哥等软件知识,以及方正证券小方,音基100,dwg转dwf,酷狗游戏盒,聊天宝客服聊天,kin ...

  6. mysql资源教程_MySQL 超级入门教程以及MySQL 资源大全的分享

    MySQL简介 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅 ...

  7. 电脑mysql 安装方法_mysql安装图解 windows安装mysql方法

    随着MYSQL版本的更新以及电脑系统的变化,我们给大家整理了各种电脑环境下安装MYSQL的图解过程,希望我们整理的内容能够帮助到大家: 编辑者:Vocabulary 下面详细介绍5.6版本MySQL的 ...

  8. mysql连接校对_mysql字符集和校对规则(Mysql校对集)

    字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到这个概念,mysql在这方便貌似很先进,大概介绍一下 简要说明 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于 ...

  9. jdbc版本低MySQL版本高_Mysql JDBC驱动版本与Mysql版本的对应问题解决

    好长时间不用Mysql了, 昨天朋友有一个小项目在我的机器上跑的一点问题都没有, 到他的机器上却是报服务器内部错误(500), 用QQ上远程协助(太慢 好长时间不用Mysql了, 昨天朋友有一个小项目 ...

  10. mysql utf-8长度_MySQL VARCHAR长度和UTF-8?mysql

    mysql5.0.3及以前版本varchar类型最大长度是255字符, 之后版本理论上长度可取值范围是1到65535字节,但实际上不可能取到这么大的值,原因是65535字节是mysql1行数据占用的长 ...

最新文章

  1. SC-A-LOAM:在A-LOAM中加入回环检测
  2. blast程序 介绍 简介
  3. 【Codeforces】1080C Masha and two friends (棋盘染色)
  4. 沈向洋回答吴恩达:我预见的2021
  5. 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
  6. Python基础数据类型之字符串(二)
  7. Python之web开发(六):python使用django框架搭建网站之登陆页搭建不同页面之间跳转
  8. web python php golang_python go 语言完成最简单的web应用
  9. hal库开启中断关中断_stm32的HAL库开发学习笔记之外部中断
  10. Python Matplotlib.plot Update image Questions
  11. ssas从mysql获取数据库_通过AMO获取SQL Server SSAS信息
  12. 昨天mac更新后,网络又出问题了。。。
  13. WordPress本地运行,PhpStudy中MySQL无法启动,数据库无法连接?
  14. 《面向机器智能的TensorFlow实践》导读
  15. [项目管理]浅谈软件项目WBS任务分解
  16. C++ 找朋友(friends)
  17. vscode插件开发流程
  18. ckeditor引入
  19. 为何我的孩子不沉迷网络游戏
  20. redhat红帽官方软件仓库同步方案

热门文章

  1. Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明
  2. configure: error: no termcap library found
  3. nginx的模块开发
  4. 汇编语言 修改内存中的过时数据
  5. 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
  6. python利用列表计算斐波那契数列前30项_python斐波那契数列的计算方法
  7. Mybatis generator 1.4.x 入门教程--转载
  8. 容器源码分析之HashSet (三)
  9. Effective Java之谨慎地使用本地方法(五十四)
  10. AttributeMap类详解