第二十四章 使用游标

注:一个数据库小白的成长之路

创建游标

CREATE PROCEDURE processorders()
BEGIN
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
END;

打开和关闭游标

-- 打开游标
OPEN ordernumbers;

-- 关闭游标
CLOSE ordernumbers;

使用游标数据

CREATE PROCEDURE processorders()
BEGIN

    -- 声明局部变量
    DECLARE o INT;

    -- 声明游标
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- 打开游标
    OPEN ordernumbers;

    -- 得到订单数据
    FETCH ordernumbers INTO o;

    -- 关闭游标
    CLOSE ordernumbers;

END;
CREATE PROCEDURE processorders()
BEGIN

    -- 声明局部变量
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;

    -- 声明游标
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- 声明异常处理程序
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    -- 打开游标
    OPEN ordernumbers;

    -- 循环所有行
    REPEAT

        -- 得到订单数据
        FETCH ordernumbers INTO o;

    -- 结束循环
    UNTIL done END REPEAT;

    -- 关闭游标
    CLOSE ordernumbers;

END;

这里的SQLSTATE'02000'表示一个“未找到”的条件,即当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;

        -- 调用储存过程ordertotal来计算order
        CALL ordertotal(o, 1, t);

        -- 将order与total插入ordertotals表中
        INSERT INTO ordertotals(order_num, total)
        VALUES(o, t);

    -- 结束循环
    UNTIL done END REPEAT;

-- 关闭游标
CLOSE ordernumbers;

END;

-- 调用存储过程
CALL processorders;

SELECT * FROM ordertotals;

注意

  • MySQL游标只能用于存储过程和函数中
  • 在游标内一般用FETCH语句去抓取每一行的数据付给新的变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容