游标的使用
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 '' 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 '' 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;