使用游标
廖家龙 用心听,不照做

使用游标

有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据;游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改

不像多数DBMS,MySQL游标只能用于存储过程(和函数)

1)创建游标【存储过程处理完成后,游标就消失(因为它局限于存储过程)】
游标用DECLARE语句创建,DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;

2)打开和关闭游标
OPEN ordernumbers;

CLOSE ordernumbers;

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了,如果你不明确关闭游标,MySQL将会在到达END语句时自动关闭它

这个存储过程声明、打开和关闭一个游标,但对检索出来的数据什么也没做
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;

 OPEN ordernumbers;

 CLOSE ordernumbers;

END;

3)使用游标数据:在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)

从游标中检索单个行(第一行):
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;

循环检索数据,从第一行到最后一行:【如果一切正常,你可以在循环内放入任意需要的处理(在FETCH语句之后,循环结束之前)】
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;


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,l,t);
      
      INSERT INTO ordertotals(order_num,total)
      VALUES(o,t);

 UNTIL done END REPEAT;

 CLOSE ordernumbers;

END;

SELECT *
FROM ordertotals;