mysql游标遍历初次学习使用
DELIMITER $$
CREATE PROCEDURE process_orders()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE order_id INT;
DECLARE order_date DATE;
-- 声明游标
DECLARE cur CURSOR FOR
SELECT id, order_date FROM orders WHERE order_status = 'pending';
-- 声明继续处理的条件
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN cur;
-- 遍历结果集
read_loop: LOOP
FETCH cur INTO order_id, order_date;
IF done THEN
LEAVE read_loop;
END IF;
-- 在这里可以对每条记录进行处理
INSERT INTO processed_orders (order_id, order_date) VALUES (order_id, order_date);
END LOOP;
-- 关闭游标
CLOSE cur;
END$$
DELIMITER ;
以下是代码中使用的主要语法
-
DELIMITER: 用于更改 MySQL 解释器的命令结束符。通常,MySQL 使用 ; 作为命令结束符,但在定义存储过程时,使用
DELIMITER $$ 可以避免中途的 ; 导致解释器错误地认为过程定义已经结束。 -
CREATE PROCEDURE: 创建一个存储过程。在本例中,存储过程名为 process_orders。
-
DECLARE:
3.1 DECLARE done INT DEFAULT 0;: 声明一个名为 done 的整数变量,初始值为 0。用于标识是否已读取完所有记录。
3.2 DECLARE cur CURSOR FOR: 声明一个游标 cur,用于遍历查询 SELECT id, order_date FROM orders WHERE order_status = ‘pending’ 返回的结果集。 -
HANDLER: 定义异常处理器。DECLARE CONTINUE HANDLER FOR NOT FOUND
表示当游标遍历到结果集末尾时,设置 done 为 1。 -
OPEN: 打开游标,使其可以开始遍历结果集。
-
FETCH: 从游标中获取一行数据,并将其存储在相应的变量中。
-
LOOP: 开始一个循环。read_loop 是循环的标识符,用于退出循环。
-
LEAVE: 用于退出循环。在 done 变量为 1 时退出循环。
-
CLOSE: 关闭游标,释放与其相关的资源。