iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 游标的定义与使用方式
  • 175
分享到

MySQL 游标的定义与使用方式

MySQL游标定义MySQL游标使用 2022-05-25 19:05:23 175人浏览 薄情痞子
摘要

创建游标 首先在Mysql中创建一张数据表: CREATE TABLE IF NOT EXISTS `store` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name

创建游标

首先在Mysql中创建一张数据表:


CREATE TABLE IF NOT EXISTS `store` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `count` int(11) NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7;
 
INSERT INTO `store` (`id`, `name`, `count`) VALUES
(1, 'Android', 15),
(2, 'iphone', 14),
(3, 'iphone', 20),
(4, 'android', 5),
(5, 'android', 13),
(6, 'iphone', 13);

我们现在要用存储过程做一个功能,统计iphone的总库存是多少,并把总数输出到控制台。


--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。
delimiter //
drop procedure if exists StatisticStore;
CREATE PROCEDURE StatisticStore()
BEGIN
  --创建接收游标数据的变量
  declare c int;
  declare n varchar(20);
  --创建总数变量
  declare total int default 0;
  --创建结束标志变量
  declare done int default false;
  --创建游标
  declare cur cursor for select name,count from store where name = 'iphone';
  --指定游标循环结束时的返回值
  declare continue HANDLER for not found set done = true;
  --设置初始值
  set total = 0;
  --打开游标
  open cur;
  --开始循环游标里的数据
  read_loop:loop
  --根据游标当前指向的一条数据
  fetch cur into n,c;
  --判断游标的循环是否结束
  if done then
    leave read_loop;  --跳出游标循环
  end if;
  --获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,
  set total = total + c;
  --结束游标循环
  end loop;
  --关闭游标
  close cur;
 
  --输出结果
  select total;
END;
--调用存储过程
call StatisticStore();

fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;


read_loop:loop
fetch cur into n,c;
set total = total+c;
end loop;

mysql中,造成游标溢出时会引发mysql预定义的NOT FOUND错误,所以在上面使用下面的代码指定了当引发not found错误时定义一个continue 的事件,指定这个事件发生时修改done变量的值。


declare continue HANDLER for not found set done = true;

所以在循环时加上了下面这句代码:


--判断游标的循环是否结束
if done then
  leave read_loop;  --跳出游标循环
end if;

如果done的值是true,就结束循环。继续执行下面的代码。

使用方式

游标有三种使用方式:
第一种就是上面的实现,使用loop循环;
第二种方式如下,使用while循环:


drop procedure if exists StatisticStore1;
CREATE PROCEDURE StatisticStore1()
BEGIN
  declare c int;
  declare n varchar(20);
  declare total int default 0;
  declare done int default false;
  declare cur cursor for select name,count from store where name = 'iphone';
  declare continue HANDLER for not found set done = true;
  set total = 0;
  open cur;
  fetch cur into n,c;
  while(not done) do
    set total = total + c;
    fetch cur into n,c;
  end while;
  
  close cur;
  select total;
END;
 
call StatisticStore1();

第三种方式是使用repeat执行:


drop procedure if exists StatisticStore2;
CREATE PROCEDURE StatisticStore2()
BEGIN
  declare c int;
  declare n varchar(20);
  declare total int default 0;
  declare done int default false;
  declare cur cursor for select name,count from store where name = 'iphone';
  declare continue HANDLER for not found set done = true;
  set total = 0;
  open cur;
  repeat
  fetch cur into n,c;
  if not done then
    set total = total + c;
  end if;
  until done end repeat;
  close cur;
  select total;
END;
 
call StatisticStore2();

游标嵌套

在mysql中,每个begin end 块都是一个独立的scope区域,由于MySql中同一个error的事件只能定义一次,如果多定义的话在编译时会提示Duplicate handler declared in the same block。


drop procedure if exists StatisticStore3;
CREATE PROCEDURE StatisticStore3()
BEGIN
  declare _n varchar(20);
  declare done int default false;
  declare cur cursor for select name from store group by name;
  declare continue HANDLER for not found set done = true;
  open cur;
  read_loop:loop
  fetch cur into _n;
  if done then
    leave read_loop;
  end if;
  begin
    declare c int;
    declare n varchar(20);
    declare total int default 0;
    declare done int default false;
    declare cur cursor for select name,count from store where name = 'iphone';
    declare continue HANDLER for not found set done = true;
    set total = 0;
    open cur;
    iphone_loop:loop
    fetch cur into n,c;
    if done then
      leave iphone_loop;
    end if;
    set total = total + c;
    end loop;
    close cur;
    select _n,n,total;
  end;
  begin
      declare c int;
      declare n varchar(20);
      declare total int default 0;
      declare done int default false;
      declare cur cursor for select name,count from store where name = 'android';
      declare continue HANDLER for not found set done = true;
      set total = 0;
      open cur;
      android_loop:loop
      fetch cur into n,c;
      if done then
        leave android_loop;
      end if;
      set total = total + c;
      end loop;
      close cur;
    select _n,n,total;
  end;
  begin
  
  end;
  end loop;
  close cur;
END;
 
call StatisticStore3();

上面就是实现一个嵌套循环,当然这个例子比较牵强。凑合看看就行。。

动态SQL

Mysql 支持动态SQL的功能,


set @sqlStr='select * from table where condition1 = ?';
prepare s1 for @sqlStr;
--如果有多个参数用逗号分隔
execute s1 using @condition1;
--手工释放,或者是 connection 关闭时, server 自动回收
deallocate prepare s1;

以上就是MySQL 游标的定义与使用方式的详细内容,更多关于MySQL 游标的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 游标的定义与使用方式

本文链接: https://www.lsjlt.com/news/10118.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL 游标的定义与使用方式
    创建游标 首先在MySql中创建一张数据表: CREATE TABLE IF NOT EXISTS `store` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name...
    99+
    2022-05-25
    MySQL 游标定义 MySQL 游标使用
  • mysql游标怎么定义和使用
    MySQL游标是用于在MySQL存储过程中处理结果集的一种机制。它允许我们在结果集中移动,并对每条记录执行特定的操作。游标定义和使用...
    99+
    2023-08-08
    mysql
  • MySQL游标的介绍与使用
    目录定义游标的作用游标的使用游标语法条件处理创建表-test1-test2-test3测试游标过程解析定义 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行遍历数据的...
    99+
    2022-12-16
    MySQL游标 MySQL游标是什么
  • MySQL 游标的作用与使用相关
    定义 我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标。 所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库查询方法,为了...
    99+
    2022-05-18
    MySQL 游标
  • SQL Server中的游标怎么定义和使用
    这篇文章主要介绍“SQL Server中的游标怎么定义和使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL Server中的游标怎么定义和使用”文章能帮助大家解决问题。游标...
    99+
    2023-06-30
  • Mysql 游标的简单使用方法
    一、游标简介 1、游标简介 游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。有了游标可以方便的对该结果集进行逐行处理。 游标的设计是一种数据缓冲区的思想,用来存放S...
    99+
    2019-10-02
    Mysql 游标的简单使用方法
  • MySQL游标的嵌套使用方法
    本篇内容主要讲解“MySQL游标的嵌套使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL游标的嵌套使用方法”吧! 前...
    99+
    2022-10-18
  • Vue中自定义标签及其使用方式
    目录问题需求自定义创建组件的vue文件编辑组件使用导入申明使用使用整个代码效果问题 我们在使用Vue开发移动端应用程序时,常常使用Vant Weapp中的组件库,但是我们想过它是怎么...
    99+
    2022-11-13
  • Oracle与MySQL内嵌游标的使用示例
    Oracle 游标用For循环比较简单,MySQL也是最近才开始用,感觉稍微麻烦一点,下边直接上代码: -----------------------------------------...
    99+
    2022-10-18
  • MySQL中的流式查询及游标查询方式
    目录一、业务场景二、罗列一下三种处理方式2.1 常规查询2.2 流式查询2.3 游标查询三、RowData3.1 RowDataStatic3.2 RowDataDynamic3.3 RowDataCursor四、JDB...
    99+
    2022-08-17
    MySQL查询 流式查询 游标查询 MySQL游标
  • element使用自定义icon图标的两种解决方式
    目录两种情况:第一种情况解决办法:第二种情况解决办法:总结写项目时,发现 element 里的图标没有我需要的图标, 两种情况: ① 简单的替换小图标,没有选中变色等要求 ② 有选中...
    99+
    2022-11-13
  • Mysql中的触发器定义与使用
    目录一、触发器的介绍二、触发器的语法(1)insert触发器(2)update触发器(3)delete触发器一、触发器的介绍 触发器是与表有关的数据库对象,指在insert/update/delete 之前或之...
    99+
    2022-11-30
    MySQL触发器的使用 MySQL触发器
  • MySQL中触发器和游标的介绍与使用
    触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。 触发器的优点: 安全性:可以...
    99+
    2022-11-11
  • Vant的Tabbar标签栏引入自定义图标方式
    目录Tabbar标签栏引入自定义图标vant自义定Tabbar图标和颜色Tabbar标签栏引入自定义图标 **使用*van-tabbar*组件** *v-model*绑定的是对应的T...
    99+
    2022-11-13
  • Java自定义异常与异常使用的最佳方式
    目录异常的分类1. 非运行时异常(Checked Exception)2. 运行时异常(Runtime Exception/Unchecked Exception)异常的处理一、对应非运行时异常,必须对其进行处理二、对于运行时异常,可以不对...
    99+
    2019-09-12
    Java异常 自定义异常 异常使用
  • SQL server中怎么使用自定义函数和游标
    SQL server中怎么使用自定义函数和游标,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。编号标准宗地编码(landCode...
    99+
    2022-10-18
  • 在iview+vue项目中使用自定义icon图标方式
    目录1. UI设计师会把自己做的图标库上传到阿里巴巴图标库2. 到购物车中点击添加至项目3. 给项目起个名字4. 把下面这些文件放到我的项目的static中5. 在main.js中全...
    99+
    2022-11-13
  • Navicat Premium自定义 sql 标签的创建方式
    目录说明自定义标签创建方式自定义sql标签创建mysql用户并授权创建触发器创建视图创建数据表创建数据库创建索引说明 Navicat 中可以自定义一下sql语句的标签,方便开发者使用...
    99+
    2022-11-13
  • Navicat Premium自定义 sql 标签的创建方式
    目录说明自定义标签创建方式自定义sql标签创建mysql用户并授权创建触发器创建视图创建数据表创建数据库创建索引说明 Navicat 中可以自定义一下sql语句的标签,方便开发者使用。开发者将自定义的sql结构转成标签之...
    99+
    2022-09-20
  • 如何在Mysql中定义与使用delimiter
    如何在Mysql中定义与使用delimiter?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。默认情况下,delimiter是分...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作