mysql存储过程使用游标
时间:2019-02-18 13:54 来源:未知 作者:IT
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)
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) |