服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 我们一起聊聊MySQL中的游标,你学会了吗?

我们一起聊聊MySQL中的游标,你学会了吗?

2023-05-07 01:03未知服务器之家 Mysql

​什么是游标? 游标(cursor)是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游 标之后,应用程序可以根据需要滚动或浏览其中的数据。 注意:MySQL游标只能用于 存储

​什么是游标?

游标(cursor)是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游 标之后,应用程序可以根据需要滚动或浏览其中的数据。

注意:MySQL游标只能用于 存储过程(和函数)。

创建游标

在创建一个游标前,我们需要先清除游标的语法

1、定义游标

DECLARE 游标名称 CURSOR FOR SQL语句;

2、打开游标

OPEN 游标名称;

3、获取结果

FETCH 游标名称 INTO 变量名称[,变量名称];

4、关闭游标

CLOSE 游标名称;

我们以Customers表来作为示例

我们一起聊聊MySQL中的游标,你学会了吗?

示例一 

定义一个存储过程,调用的时候执行里面的游标

CREATE PROCEDURE PROC1()
BEGIN
-- 定义两个存放结果的变量
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- 声明游标
DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
-- 打开游标
OPEN MY;
-- 获取结果
FETCH MY INTO NAME,ADDR;
-- 这里是为了显示获取结果
SELECT NAME,ADDR;
-- 关闭游标
CLOSE MY;
END;

我们执行完上面的存储过程后,就可以调用该存储过程了

CALL PROC1();

得到结果:

我们一起聊聊MySQL中的游标,你学会了吗?

这里肯定有小伙伴好奇,customers表里明明有7条记录,为什么只显示了1条记录?

这是因为游标的变量只保留了customers表中的第一行数据,如果要查看后面的数据,就需要循环往下移动游标,才能继续查看。

示例二

定义一个存储过程,调用存储过程时,将表customers里的数据循环写入新的表里面。

CREATE PROCEDURE PROC2()
BEGIN
-- 定义两个存放结果的变量
DECLARE FLAG INT DEFAULT 0;
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- 声明游标
DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;


DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1;
-- 打开游标
OPEN MY;
-- 循环体部分
L1:LOOP
-- 获取结果
FETCH MY INTO NAME,ADDR;
IF FLAG=1 THEN
LEAVE L1;
END IF;
-- 这里是为了显示获取结果
INSERT INTO cus VALUES(NAME,ADDR);
-- 关闭游标
END LOOP; -- 结束循环
CLOSE MY;
END;

然后我们执行这个存储过程,并查询cus表里的数据

CALL PROC2();
SELECT * FROM cus;

结果:

我们一起聊聊MySQL中的游标,你学会了吗?

结果与customers里的一致,但是这些结果是循环一条一条往下移动的过程中插入的,即这个循环执行了7次。

以上就是游标的基本操作原理了,此外游标的循环体还有WHILE,REPEAT等操作方式,他们的操作方式与LOOP类似,都是用来循环执行循环体里面的内容,直到循环结束。​

延伸 · 阅读

精彩推荐
  • Mysql解决seata不能使用mysql8版本的问题方法

    解决seata不能使用mysql8版本的问题方法

    这篇文章主要介绍了解决seata不能使用mysql8版本的问题方法,文中通过示例和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    虚心低调的tom9502021-03-18
  • MysqlMySQL的表空间是什么

    MySQL的表空间是什么

    这篇文章主要介绍了MySQL的表空间是什么,帮助大家更好的理解和使用MySQL表的相关知识,感兴趣的朋友可以了解下...

    赐我白日梦11392021-03-09
  • Mysqlmysql split函数用逗号分隔的实现

    mysql split函数用逗号分隔的实现

    这篇文章主要介绍了mysql split函数用逗号分隔的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    xinglei2009099319702021-02-26
  • MysqlMySQL 游标的作用与使用相关

    MySQL 游标的作用与使用相关

    这篇文章主要介绍了MySQL游标的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下...

    翁智华10752021-04-05
  • MysqlMysql 删除数据库drop database详细介绍

    Mysql 删除数据库drop database详细介绍

    在mysql中,我们可以使用DROP DATABASE来删除数据库,并且数据库中所有表也随之删除。本文通过实例向各位码农介绍DROP DATABASE的使用方法,需要的朋友可以参...

    MYSQL教程网3932020-07-02
  • Mysql关于MySQL中savepoint语句使用时所出现的错误

    关于MySQL中savepoint语句使用时所出现的错误

    这篇文章主要介绍了关于MySQL中savepoint语句使用时所出现的错误,字符串出现e时所产生的问题也被作为MySQL的bug进行过提交,需要的朋友可以参考下 ...

    MYSQL教程网4892020-05-06
  • MysqlWindows环境下重置mysql密码操作命令

    Windows环境下重置mysql密码操作命令

    Windows XP系统、xampp集成环境如何重置mysql密码,接下来为大家详细介绍下,感兴趣的各位可以参考下哈,希望可以帮助到你们 ...

    MYSQL教程网3312019-12-21
  • Mysql通过SQL语句来备份,还原数据库

    通过SQL语句来备份,还原数据库

    这里仅仅用到了一种方式而已,把数据库文件备份到磁盘然后在恢复. ...

    mysql教程网6802019-11-05