• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL游标概念与用法详解

    本文实例讲述了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事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

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

    您可能感兴趣的文章:
    • MySQL 游标的定义与使用方式
    • Mysql 存储过程中使用游标循环读取临时表
    • mysql声明游标的方法
    • 详解Mysql 游标的用法及其作用
    • mysql游标的原理与用法实例分析
    • 带你彻底搞懂python操作mysql数据库(cursor游标讲解)
    • mysql存储过程之游标(DECLARE)原理与用法详解
    • mysql的存储过程、游标 、事务实例详解
    • Mysql存储过程中游标的用法实例
    • Mysql存储过程循环内嵌套使用游标示例代码
    • MySQL存储过程中游标循环的跳出和继续操作示例
    • MySQL 游标的作用与使用相关
    上一篇:MySQL存储过程概念、原理与常见用法详解
    下一篇:MySQL用户与权限的管理详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL游标概念与用法详解 MySQL,游标,概念,与,用法,