MYSQL学习笔记(二十)使用游标

来源:互联网 发布:零售行业数据 编辑:程序博客网 时间:2024/05/22 06:23
  1. 游标
    游标是一个存储在MYSQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
    游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据浏览或更改。
    MYSQL游标只能用于存储过程(和函数)
  2. 使用游标的步骤:
    (1) 在能够使用游标前,必须声明(定义)它。此时未检索,只是定义要用SELECT语句
    (2) 声明后,打开游标以供使用
    (3) 对于天有数据的游标,根据需要取出(检索)各行
    (4) 在结束游标使用时,必须关闭游标
  3. 创建游标
    CREATE PROCEDURE processorders()
    BEGIN
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
    END;
    在这个存储过程中,DECLARE语句用来定义和命名游标,这里为ordernumbers
  4. 打开和关闭游标
    OPEN ordernumbers;
    CLOSE ordernumberes;
    打开和关闭游标应放在存储过程进行
  5. 使用游标数据
    CREATE PROCEDURE processorders()
    BEGIN
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
    OPEN ordernumbers;
    FETCH ordernumbers INTO o;
    CLOSE ordernumbers;
    END;
    其中FETCH用来检索当前行的order_num列(自动从第一行开始)到一个名为o的局部声明的变量中。对检索出的数据不做任何处理
  6. 工作样例
    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;
    这个例子使用FETCH检索当前order_num到声明的名为o的变量中。
    增加另一个名为t的变量,存储每个订单的合计。
    当此处FETCH在REPEAT内,因此它反复执行到done为止。
    在前面用DEFAULT 0定义变量done。
    CONTINUE HANDLER,是在条件出现时被执行的代码。SQLSTATE ‘02000’出现时,SET done=1。
    在此存储过程运行中创建了一个新表,这个表将保存存储过程生成的结果。FETCH取每个order_num,然后用CALL执行另一个存储过程来来计算每个订单的带税的合计(结果存储到t)。最后,用INSERT保存每个订单的订单号和合计。