我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 游标 - G

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 游标 - G

MySQL 游标 - G

MySQL 游标

 

  • SQL语句是“面向集合编程”,重点在于“获得什么”,而不是“如何获得”。
  • 有时候我们不需要对查询结构集的每一条都进行相同的操作,而是只操作其中的某些行,这时候就需要面向过程的编程方法,而游标就是面向过程编程方式的体现
  • 游标就相当于“指针”,它一次只指向一行
  • 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作

游标的使用

声明(给定结果集)、打开、通过游标获取数据、关闭、释放游标

  • 声明,给定结果集,存储过程结束后游标就被清理

    DECLARE cursor_name CURSOR FOR (SELECT...);
    
  • 打开游标,将结果集送到游标工作区

    OPEN cursor_name;
    
  • 通过游标获取数据

    游标先判断当前行是否为空,若为空则改变done,若不为空则将数据存放到临时变量中,读取后进入下一行为下次读取做准备。

    一定要想明白FETCH的运行方式,不然可能会出现重复FETCH到数据的情况

    FETCH cursor_name INTO (变量名s);
    
  • 关闭游标

    CLOSE cursor_name;
    
  • 因为每次调用FETCH游标就会尝试下一行,因此还要声明一个 NOT FOUND处理程序来处理游标读取不到下一行的情况

    DECLARE CONTINUE HANDLER FOR not found SET done = true;
    

    或者

    DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done = true;
    

    SQLSTATE "02000"可以看做和not found一样,SQLSTATE "02000"是当没有更多的行以供循环时出现的一个条件。

    上面两种都可行,至于done赋值为true还是为1,就要看done是如何定义的,当然定义为INIT的为可以初始化为true

     

使用举例1

现有如下数据表

mysql> select * from t;
+----+------+-----------------+
| id | nums | content         |
+----+------+-----------------+
|  1 |    2 | NULL            |
|  2 |    6 | 二六一十二      |
|  3 |    3 | 三三得九        |
+----+------+-----------------+
3 rows in set (0.00 sec)

我们通过游标读取每一行并实现将nums导入到新数据表中,在实际工作中这种方式可以大大减少我们"分表"时的操作难度。

DELIMITER //

CREATE PROCEDURE transferData()
BEGIN
DECLARE temp_num INT;
DECLARE done BOOLEAN DEFAULT false;
DECLARE cur CURSOR FOR select nums FROM t;
DECLARE continue HANDLER FOR not found SET done = true;

CREATE TABLE IF NOT EXISTS t2 (auto_id int PRIMARY KEY AUTO_INCREMENT, val int not null);

OPEN cur;
REPEAT
IF NOT done THEN
FETCH cur INTO temp_num;
INSERT INTO t2 (val) VALUES (temp_num);
END IF;
UNTIL done=true END REPEAT;
CLOSE cur;
SELECT * from t2;
END//

DELIMITER ;

执行该存储过程后自动显示如下结果:

mysql> select * from t2;
    -> //
+---------+-----+
| auto_id | val |
+---------+-----+
|       1 |   2 |
|       2 |   6 |
|       3 |   3 |
|       4 |   3 |
+---------+-----+
4 rows in set (0.00 sec)

我们会发现,为什么这里多了一行数据?看起来是被重复FETCH并插入了,究其原因,是因为没有理清楚FETCH的运作方式---没有搞清楚什么时候FETCH会改变done

如果我们改成

CREATE PROCEDURE transferData2()
BEGIN
DECLARE temp_num INT;
DECLARE done BOOLEAN DEFAULT false;
DECLARE cur CURSOR FOR select nums FROM t;
DECLARE continue HANDLER FOR not found SET done = true;

CREATE TABLE IF NOT EXISTS t3 (auto_id int PRIMARY KEY AUTO_INCREMENT, val int not null);

OPEN cur;
REPEAT
FETCH cur INTO temp_num;
IF NOT done THEN
INSERT INTO t3 (val) VALUES (temp_num);
END IF;
UNTIL done=true END REPEAT;
CLOSE cur;
SELECT * from t3;
END//

则结果会符合我们的预期

mysql> select * from t3//
+---------+-----+
| auto_id | val |
+---------+-----+
|       1 |   2 |
|       2 |   6 |
|       3 |   3 |
+---------+-----+
3 rows in set (0.00 sec)

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 游标 - G

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

下载Word文档

猜你喜欢

MySQL 游标 - G

MySQL 游标 SQL语句是“面向集合编程”,重点在于“获得什么”,而不是“如何获得”。有时候我们不需要对查询结构集的每一条都进行相同的操作,而是只操作其中的某些行,这时候就需要面向过程的编程方法,而游标就是面向过程编程方式的体现游标就相当于“指针”,它一次
MySQL 游标 - G
2016-08-31

MySQL游标

阅读目录 定义游标的作用游标的使用游标语法条件处理 创建表:test1、test2、test3写一个函数,计算 test1 表中 a、b 字段所有的和测试游标过程解析 定义 游标(Cursor)是处理数据的一种方法,为了
2023-08-30
2024-04-02

mysql游标是什么

本篇内容介绍了“mysql游标是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明1、游标是用来存储查询结果集的数据类型 , 在存储过程
2023-06-20

MySQL Error (Always Continue) - G

MySQL Error (Always Continue) 其实大部分error在网上都有对应的解决办法,尤其是对Mysql这种使用范围很广的技术。自己就不为每个error单独发布博客了,仅在这里不断添加,将自己遇到过的error,error原因,以及解决过程
MySQL Error (Always Continue) - G
2020-05-19

mysql声明游标的方法

mysql声明游标的方法: 1、声明变量和游标declare result varchar(3000); declare flag1 varchar(100); DECLARE done INT DEFAULT FALSE; declare
2022-05-16

正确使用MySQL JDBC游标

转载自:http://blog.csdn.net/seven_3306/article/details/9303879该文章提出三种方式可以正确使用mysql 游标1、当statement设置以下属性时,采用的是流数据接收方式,每次只从服务
2023-06-03

MySQL存储过程和游标

一、存储过程什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法。什么是存储过程:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改
MySQL存储过程和游标
2019-12-05

MySQL游标的使用方式

MySQL游标允许程序员逐行遍历结果集并操作数据。它支持只读和可更新游标。通过使用DECLARE、OPEN、FETCH、UPDATE和CLOSE语句可以轻松创建、操作和关闭游标。游标的优点包括多次迭代结果集和有效传输大型结果集。然而,缺点包括占用内存和事务中的复杂性。替代方案有结果集迭代器、临时表和存储过程。
MySQL游标的使用方式
2024-04-02

初用MySQL Mysql示例库 Navicat15 - G

初用MySQL Mysql示例库 Navicat15 查看初始密码MySQl首次启动会创建“超级管理员账号”root@localhost,初始密码存储在日志文件中,通过grep搜索并查看:grep "temporary password" /var/log
初用MySQL  Mysql示例库  Navicat15 - G
2019-06-15

游标

一个对表进行查询的SQL语句通常都会产生一组记录,称为结果集。但是许多应用程序,尤其PL/SQL嵌入式的主语言(如java,C等),通常并不能把整个结果集作为一个单元来处理,因此,这些应用程序需要一种机制来保证每次只处理结果集中的一行或几行,游标就提供了这种机
游标
2020-02-14

MySQL函数和游标之初见

MySQL函数基本语法函数申明要声明返回类型,用returns指定。函数体中要有返回语句,return 返回值。函数执行有别与存储过程执行,不需要Call关键字。定义一个返回时间和uuid拼接字符串的函数-- 创建函数CREATE FUNCTION my_fu
MySQL函数和游标之初见
2019-11-26

编程热搜

目录