MySQL5添加了对游标的支持
-
什么是游标
在SELECT检索操作返回的结果集的行,使用简单的SELECT语句无法得到第一行、前十行、在检索结果前进/后退一行这些操作。使用游标能实现这些操作。
游标是存储在MySQL服务器上的数据库查询,是该语句检索出来的结果集。在存储了游标之后,就能根据需要滚动/浏览其中的数据。主要应用于交互式应用,用户需要滚动屏幕上的数据,并对数据进行浏览/做出更改。
MySQL的游标只能用于存储过程&函数。
-
使用游标
1、在使用前定义游标,定义要使用的SELECT语句
2、声明之后就必须打开游标以供使用,用前边的SELECT语句把数据实际检索出来
3、对于填有数据的游标,按需取出各行
4、结束使用游标后要关闭游标
-
创建游标
使用DECLARE语句创建,命名游标,并指定SELECT语句
CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -- 打开游标 OPEN ordernumbers; -- 关闭游标 CLOSE ordernumbers; END;-- 如果不明确关闭游标那么在END语句时会关闭它 -
打开和关闭游标
OPEN ordernumbers; CLOSE ordernumbers;#释放游标使用的所有内部内存和资源,所以游标不在被需要时要关闭 -
使用游标数据
#使用FETCH语句分别访问它的每一行,FETCH指定检索什么数据、检索出来的数据存储在哪 #本示例从游标中检索单个行 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; #其中FETCH用来检索当前行的order_num列到一个名为o的局部变量中#本示例---循环检索数据,从第一行到最后一行 CREATE PROCEDURE processorders() BEGIN -- 指定本地变量 DECLARE done BOOLEAN DEFAULT O; 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;#反复执行直到done为真,和上班的SET done语句有关 UNTIL done END DEPEAT; -- 关闭游标 CLOSE ordernumbers; END;#进一步应用 CREATE PROCEDURE processorders() BEGIN DECLARE done BOOLEAN DEFAULT O; 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; CALL ordertotal(o,1,t); INSERT INTO ordertotals(order_num.total) VALUES(o,t); UNTIL done END DEPEAT; CLOSE ordernumbers; END;在本示例中,增加另一个t变量存储每个订单的合计, 在存储过程还在运行中创建了一个新表(如果不存在)名为ordertotals保存存储过程中生成的结果。
FETCH取每个order_num然后CALL执行另一个存储过程来计算每个订单的带税合计存储到t,最后INSERT保存每个订单的订单号和合计。
SELECT * FROM ordertotals;
2813



被折叠的 条评论
为什么被折叠?



