> 数据库 > MySQL >

mysql存储过程使用游标

1、游标的作用及属性

游标的作用就是用于对查询数据库所返回的数据集进行遍历,以便进行相应的操作;游标有下面这些属性:

a、游标是只读的,也就是不能更新它;

b、游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录;

c、避免在已经打开游标的表上更新数据。
d、mysql游标特性只用于存储过程。


2、如何使用游标

使用游标需要遵循下面步骤:
a、首先用DECLARE语句声明一个游标

    DECLARE cursor_name CURSOR FOR SELECT_statement; 


上面这条语句就为我们执行的select语句返回的数据集指定了一个游标 。

b、其次需要使用OPEN语句来打开上面你定

OPEN cursor_name;   


c、接下来你可以用FETCH语句来获得下一行数据,并且游标也将移动到对应的记录上(这个就类似java里面的那个iterator。
FETCH cursor_name INTO variable list;

d、然后最后当我们所需要进行的操作都结束后我们要把游标释放掉。

CLOSE cursor_name; 


这是在navicat中以mysql的存储过程例程,包含一个游标,调用存储过程。
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`()
BEGIN
    #Routine body goes here...
DECLARE done boolean DEFAULT 0;
DECLARE no_more_data boolean DEFAULT 0;
DECLARE o int;
DECLARE t DECIMAL(8,2); -- 对每个订单税后总价
-- 定义一个游标
DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders ORDER BY order_num DESC;
-- 定义循环结束条件
-- 条件一:当sqlstate为02000时候退出
DECLARE CONTINUE HANDLER FOR SQLSTATE  '02000'  SET done=1;
-- 条件二:当没找到数据时候,但是实验说明这个条件有问题。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_data=1;
-- 创建一个表用于保存结果集,如果没有就创建
CREATE TABLE IF NOT EXISTS ordertotals(
order_num INT ,total DECIMAL(8,2)
);
-- 开启游标
OPEN ordernumbers;
-- 遍历所找到的结果集中的所有元素
REPEAT
FETCH ordernumbers INTO o;
SELECT o; -- 输出结果
CALL computeTax(o,t,1); -- 计算税后总价
-- 插入一条记录
INSERT INTO ordertotals(order_num, total)
VALUES(o,t);
UNTIL done   -- 结束循环条件
END REPEAT;
-- 关闭游标
CLOSE ordernumbers;
END;


(责任编辑:IT)