使用游标前,必须声明。这个过程没有检索数据,要使用select语句。
一旦声明必须打开游标,这个过程使用前面定义的SELECT 语句把数据实际检索出来。
对于填有数据的游标,根据需要取出各行。
在游标结束之前,必须关闭游标。
一、创建游标
使用DECLARE语句。命名游标,并定义相应额SELECT语句,根据需要带WHERE和其他子句。
create PROCEDURE demo()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END
上面的存储过程定义了 名字为 ordernubers 的游标,使用了可以检索所有订单的SELECT 语句。
定义游标之后,可以打开它。
打开游标:open ordernumbers;
关闭游标:CLOSE ordernubers; 如果不明确关闭游标,MYSQL将会达到END语句时自动关闭它。上面的语句可以进行如下操作
create PROCEDURE demo()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
CLOSE ordernumbers;
END
这个存储过程生声明、打开和关闭一个游标。但对检索数据什么都没做。
游标被打开后,使用FETCH语句指定检索什么数据,检索出来的数据存储在什么地方,
实例:
使用游标中检索单个行
create PROCEDURE demo()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END
其中FETCH用来检索当前行的order_num 列(将自动从第一行开始)到一个名为o的局部声明的变量中,对检索出的数据不做任何处理。
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t DECIMAL(8,2);
DECLARE ordernumbers CURSOR
for
select order_num from orders;
--当FETCH到最后一行的时候,会将done更改成1
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
查询出orders数据,通过游标写入新建的table ordertotals中。
输入 sql call demo;
select * from ordertotals; 即可查出orders查出来的数据信息