mysql笔记(21)--使用游标
Posted HardyDragon_CC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql笔记(21)--使用游标相关的知识,希望对你有一定的参考价值。
什么是游标?
游标(cursor)是一个存储在mysql服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
- MySQL游标只能用于存储过程(和函数)。
为什么需要游标?
有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。
如何使用游标?
如何创建游标?
在创建存储过程中,在存储体体中使用 DECLARE 游标名 CURSOR
创建游标,后面跟 for 定义 查询语句。
DROP PROCEDURE IF EXISTS mysql_must_study.processorders;
DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num
FROM mysql_must_study.orders;
END$$
DELIMITER ;
存储过程处理完成后,游标就消失(因为它局限于存储过程)。
如何打开和关闭游标?
使用 OPEN CLOSE 在存储过程打开和关闭游标。
DROP PROCEDURE IF EXISTS mysql_must_study.processorders;
DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num
FROM mysql_must_study.orders;
OPEN ordernumbers;
CLOSE ordernumbers;
END$$
DELIMITER ;
如何使用游标数据?
在一个游标被打开后,可以使用FETCH
语句分别访问它的每一行。FETCH
指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)。
- DECLARE o INT; 定义变量
- FETCH ordernumbers INTO o; 将检索的数据放到变量 o 里面。
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num
FROM mysql_must_study.orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END
CREATE PROCEDURE mysql_must_study.processorders()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num
FROM mysql_must_study.orders;
DECLARE CONTINUE handler FOR SQLSTATE '02000' SET done=1;
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
until done END REPEAT ;
CLOSE ordernumbers;
END
当遍历完所有行后停止,判断条件是 '02000'
实际处理数据案例
CREATE DEFINER=`root`@`localhost` PROCEDURE `mysql_must_study`.`processorders`()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t decimal(8,2);
DECLARE ordernumbers CURSOR
FOR
SELECT order_num
FROM mysql_must_study.orders;
DECLARE CONTINUE handler FOR SQLSTATE '02000' SET done=1;
CREATE TABLE IF NOT EXISTS ordertotals
(order_num INT,total DECIMAL(8,2));
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
CALL mysql_must_study.ordertotal(o,1,t);
INSERT INTO ordertotals(order_num,total)
VALUES(o,t);
until done END REPEAT ;
CLOSE ordernumbers;
END
执行存储过程,然后查询新生的表
CALL processorders();
SELECT *
FROM ordertotals;
这样,我们就得到了存储过程、游标、逐行处理以及存储过程调用其他存储过程的一个完整的工作样例
总结
- 游标只能配合存储过程使用,作为定义 select 的结果集合。
- 使用游标必须开启和关闭
- 使用
fetch
获取游标集合内元素 - 可以循环遍历游标内元素,并与其他变量进行操作。
以上是关于mysql笔记(21)--使用游标的主要内容,如果未能解决你的问题,请参考以下文章
MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)
Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器