MySQL 基础知识7 (使用游标)

一、游标概述

1. 基本定义:一个存储在MySQL服务器上的数据库查询, 并非一条SELECT语句, 而是被该语句检索出来的结果集

2. 主要作用:需要在获取检索数据后的行中前进或后退一行或多行, 存储游标后, 应用程序可根据需要滚动或浏览其中的数据

3. 作用范围:只能用于存储过程(和函数)

4. 使用步骤:

(1). 在能使用游标前, 必须声明(定义)它:该部分只是定义需要使用的SELECT语句

(2). 声明游标后,必须打开游标以供使用:该部分用之前定义的SELECT语句将数据实际检索出来

(3). 对于填有数据的游标, 根据需要取出(检索)各行

(4). 在结束游标使用时, 必须关闭游标

二、使用游标

1. 创建游标:DECLARE

说明:该语句的发布存在特定地次序,该语句定义的局部变量必须在定义任意游标或句柄之前,句柄必须在游标之后定义

 CREATE PROCEDURE procedureorders()
 BEGIN
 -- 定义游标
        DECLARE ordernumbers    CURSOR
        FOR
        SELECT order_num FROM orders;
-- 打开游标
        OPEN ordernumbers;
-- 关闭游标
        CLOSE ordernumbers;
END;

2. 创建游标 (检索每行数据)

说明:当游标被打开后, 可以使用FETCH语句分别访问它的每一行

CREATE PROCEDURE processorders()
BEGIN
        -- 定义局部变量:判断是否完成和数量
        DECLARE done BOOLEAN DEFAULT 0;
        DECLARE var INT;
        -- 定义游标:查询订单号
        DECLARE ordernumbers CURSOR
        FOR
        SELECT order_num FROM orders;
        -- 定义条件:DECLARE CONTINUE HANDLER  SQL条件和设置内容:FOR SQLSTATE 自定义内容 SET 设置内容;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
        -- 打开游标
        OPEN ordernumbers;
        -- 循环语句
        REPEAT
            -- 获取订单数量
            FETCH ordernumbers INTO var;
        -- 结束循环
        UNTIL done END REPEAT;
        -- 关闭游标
        CLOSE ordernumbers;
END;

3. 创建游标 (除REPEAT语句之外, 还有循环语句用来重复执行代码)

CREATE PROCEDURE processorders()
BEGIN
        DECLARE done BOOLEAN DEFAULT 0;
        DECLARE o INT;
        DECLARE t DECIMAL(8,2);
        DECLARE ordernumbers CURSOR
        FOR
        SELECT order_num FROM 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 ordertotal(o,1,t);
            INSERT INTO ordertotals(order_num, total)
            VALUES(o, t);
        UNTIL done END REPEAT;
        CLOSE ordernumbers;
END;

4. 调用和使用游标 (检索数据)

CALL processorders;

SELECT * FROM ordertotals;

5. 删除游标 (无论是否存在)

DROP PROCEDURE IF EXISTS processorders;
posted @ 2023-01-28 10:41  像风一样狂奔的独身犬  阅读(1041)  评论(0)    收藏  举报