游标的使用
MySQL中游标只能用于存储过程
创建游标
CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; END;
打开关闭游标
CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; --打开游标 OPEN ordernumbers; --关闭游标 CLOSE ordernumbers; END;
使用游标数据
CREATE PROCEDURE processorders() BEGIN --定义一个逻辑控制临时变量 DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; --创建游标 DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; --条件出现时执行的代码: --当SQLSTATE '02000'出现时,SET done=1 --SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多行供循环而不能继续循环时,出现这个条件 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; --打开游标 OPEN ordernumbers; --循环遍历所有行 REPEAT --得到数据 FETCH ordernumbers INTO o; --结束循环 UNTIL done END REPEAT; --关闭游标 CLOSE ordernumbers; END
注意:DECLARE语句的次序,DECLARE语句有特定的次序,用DECLARE定义局部变量必须在定义任意游标或者句柄之前,而句柄又必须在游标之后定义。
REPEAT语句的语法更适合对游标进行循环
综合应用
-- 创建存储过程 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; -- 创建表ordertotals CREATE TABLE IF NOT EXISTS ordertotals( order_num INT, total DECIMAL(8,2) ); -- 打开存储过程 OPEN ordernumbers; -- 游标循环所有行 REPEAT -- 获取数据 FETCH ordernumbers INTO o; -- 将得到的参数o传入之前定义的存储过程ordertotal CALL ordertotal(o,1,t); -- 将得到的值存入表 ordertotals INSERT INTO ordertotals(order_num,total)VALUSE(o,t); -- 结束游标循环 UNTIL done END REPEAT; -- 关闭游标 CLOSE ordernumbers; END;