我是靠谱客的博主 糊涂大船,最近开发中收集的这篇文章主要介绍1-7:使用游标,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

游标

有时,需要在检索出来的行中前进或后退一行或多行
游标是一个存储在MySQL服务器上的数据库查询
是被SELECT检索出来的结果集
存储了游标后,
应用可根据需要滚动或浏览其中的数据

MySQL游标只能用于存储过程[和函数]

使用游标

- 在能使用游标前,需先声明它
只是定义要使用的SELECT语句
- 一旦声明后,
必须打开游标以供使用
过程用前面定义的SELECT语句把数据实际检索出来
- 对填有数据的游标,需取出[检索]各行
- 结束游标使用时,需关闭游标

创建游标

DECLARE
CREATE PROCEDURE processorders()
BEGIN
	DECLARE ordernumbers CURSOR
	FOR
	SELECT order_num FROM orders;
END;

DECLARE用来定义和命名游标
存储过程处理完后,游标消失

打开和关闭游标

OPEN ordernumbers;
CLOSE ordernumbers;// 释放游标使用的所有内部内存和资源
一个游标关闭后,需重新打开
如不明确关闭游标,MySQL将会在到达END时自动关闭它
CREATE PROCEDURE processorders()
BEGIN
	DECLARE ordernumbers CURSOR
	FOR 
	SELECT order_num FROM orders;

	OPEN ordernumbers;
	CLOSE ordernumbers;
END;

存储过程,
声明
打开
关闭
一个游标

使用游标数据

一个游标被打开后,
可使用FETCH语句分别访问它的每一行
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 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;
反复执行FETCH,直到done为1
SQLSTATE '02000'是一个未找到条件
当REPEAT由于没有更多的行供循环而不能继续时,
出现此条件

DECLARE语句次序
DECLARE语句的发布存在特定的次序
用DECLARE语句定义的局部变量必须在定义任意游标或句柄前定义
句柄必须在游标后定义

局部变量
游标
句柄

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;
		CALL ordertotal(o, 1, t);// 另一个存储过程
		INSERT INTO ordertotals(order_num, total)
		VALUES(o, t);
	UNTIL done END REPEAT;
	CLOSE ordernumbers;
END;

SELECT *
FROM ordertotals;

最后

以上就是糊涂大船为你收集整理的1-7:使用游标的全部内容,希望文章能够帮你解决1-7:使用游标所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部