暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL_游标

lin在路上 2020-08-14
489

游标用于在检索出来的结果集中前进或后退一行或多行。MySQL中游标只能用于存储过程

1 使用步骤

  • 创建(定义)游标,这个过程实际上没有检索数据,只是定义要使用的SELECT语句

  • 打开游标,这个过程用前面定义的SELECT语句把数据实际检索出来。新版SQL游标打开关闭不能直接使用,需要放在存储过程中

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

  • 关闭游标

2 操作

2.1 检索单行

 CREATE PROCEDURE processorders(
     OUT o DECIMAL (8, 2))
 BEGIN
     DECLARE ordernumbers CURSOR FOR
     SELECT order_num FROM `order`;
     -- 定义游标
 
     OPEN ordernumbers;
     -- 打开游标
 
     FETCH ordernumbers INTO o;
     -- 将第一列的值赋值给o
 
    CLOSE ordernumbers;
    -- 关闭游标
 END;
 #创建带游标的存储过程
 
 
 CALL processorders(@order_num);
 SELECT @order_num
 #执行并展示
复制

2.2 循环检索

 CREATE PROCEDURE processorders()
 BEGIN
     DECLARE o int;
     DECLARE done BOOLEAN DEFAULT 0;
 
     DECLARE ordernumbers CURSOR FOR
     SELECT order_num FROM `order`;
     -- 定义游标
 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
     -- 定义CONTINUE HANDLER,当SQLSTATE '02000'(代表未找到条件)出现时,done=1
 
     OPEN ordernumbers;
     -- 打开游标
 
     REPEAT
     -- 开始循环
 
          FETCH ordernumbers INTO o;
          -- 将值赋值给o
 
     UNTIL done END REPEAT;
     -- 结束循环
 
       CLOSE ordernumbers;
       -- 关闭游标
 END;
 #创建带游标的存储过程
复制

2.3 循环体中增加执行

 CREATE PROCEDURE processorders()
 BEGIN
     DECLARE o int;
     DECLARE done BOOLEAN DEFAULT 0;
     DECLARE t DECIMAL(8,2);
 
     DECLARE ordernumbers CURSOR FOR
     SELECT order_num FROM `order`;
     -- 定义游标
 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
     -- 定义CONTINUE HANDLER,当SQLSTATE '02000'(代表未找到条件)出现时,done=1
 
    CREATE TABLE IF NOT EXISTS ordertotals(order_num INT,total DECIMAL(8,2));
     -- 若表不存在则创建表
 
     OPEN ordernumbers;
     -- 打开游标
 
     REPEAT
     -- 开始循环
 
          FETCH ordernumbers INTO o;
          -- 将值赋值给o
 
          CALL ordertotal(o,1,t);
          -- 调用存储过程
 
          INSERT INTO ordertotals(order_num,total)
          VALUES(o,t);
          --插入数据到新表
 
     UNTIL done END REPEAT;
     -- 结束循环
 
     CLOSE ordernumbers;
     -- 关闭游标
 END;
 
 CALL processorders();
 #执行,生成新表并插入数据
复制



文章转载自lin在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论