注:一个数据库小白的成长之路
创建游标
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
打开和关闭游标
-- 打开游标
OPEN ordernumbers;
-- 关闭游标
CLOSE ordernumbers;
使用游标数据
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;
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;
这里的SQLSTATE'02000'表示一个“未找到”的条件,即当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;
-- 创建一个表去存储结果
CREATE TABLE IF NOT EXISTS ordertotals(order_num INT, total DECIMAL(8, 2));
-- 打开游标
OPEN ordernumbers;
-- 循环所有行
REPEAT
-- 得到订单数据
FETCH ordernumbers INTO o;
-- 调用储存过程ordertotal来计算order
CALL ordertotal(o, 1, t);
-- 将order与total插入ordertotals表中
INSERT INTO ordertotals(order_num, total)
VALUES(o, t);
-- 结束循环
UNTIL done END REPEAT;
-- 关闭游标
CLOSE ordernumbers;
END;
-- 调用存储过程
CALL processorders;
SELECT * FROM ordertotals;
注意
- MySQL游标只能用于存储过程和函数中
- 在游标内一般用FETCH语句去抓取每一行的数据付给新的变量