1、创建游标
mysql中游标只能在存储过程和函数中使用。
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
2、打开和关闭游标
OPEN ordernumbers;
CLOSE ordernumbers;
3、使用游标数据
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
SELECT o;
CLOSE ordernumbers;
END;
其中 FETCH 用来检索当前行的 order_num 列(将自动从第一行开始)到一个名为 o 的局部声明的变量中。对检索出的数据不做
任何处理。
4、循环检索数据
CREATE PROCEDURE processorder()
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;
IF NOT done THEN
SELECT o;
CALL ordertotal1(o, 1,t);
INSERT INTO ordertotals(order_num, total) VALUES(o,t);
END IF;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END;
和教材中的不同,由于repeat 和do while 想用,会多执行一次操作,使用IF语句判断是否结束。蓝色部分:
这条语句定义了一个 CONTINUE HANDLER ,它是在条件出现时被执行
的代码。这里,它指出当 SQLSTATE '02000' 出现时, SET done=1。SQLSTATE
'02000' 是一个未找到条件,当 REPEAT 由于没有更多的行供循环而不能继
续时,出现这个条件。