「这是我参加2022初次更文应战的第27天,活动详情查看:2022初次更文应战」。

SQL 检索操作返回成果集,如果简略地运用 SELECT 句子,没有办法得到榜首行、下一行或前 10 行。有时,需要在检索出来的行中前进或撤退一行或多行,这便是游标的用处地点。游标(cursor)是一个存储在 DBMS 服务器上的数据库查询, 它不是一条 SELECT 句子,而是被该句子检索出来的成果集。在存储了 游标之后,应用程序可以根据需要翻滚或浏览其间的数据。

运用游标

游标运用的进程:

  • 在运用游标前,有必要声明(界说)它。这个进程实践上没有检索数据, 它只是界说要运用的 SELECT 句子和游标选项。
  • 一旦声明,就有必要翻开游标以供运用。这个进程用前面界说的 SELECT 句子把数据实践检索出来。
  • 对于填有数据的游标,根据需要取出(检索)各行。
  • 在完毕游标运用时,有必要封闭游标,可能的话,释放游标。

声明游标后,可以根据需要频频地 翻开或封闭 游标。在游标翻开时,可根据需要频频地履行 操作。

留意:不像大都DBMS,MySQL游标只能用于存储进程(和函数)。


创建游标

运用 DECLEAR 来创建游标,DECLARE 命名游标,并界说相应的 SELECT 句子,根据需要带 WHERE 和 其他子句。

下面的句子界说了名为 ordernumbers 的游标,运用了可以检索一切订单的 SELECT 句子。

Order表中的信息:

Mysql必知必会:游标的使用

DROP PROCEDURE IF EXISTS processorder;
CREATE PROCEDURE processorder()
BEGIN
	-- 界说游标
	DECLARE ordernumbers CURSOR
	FOR
	SELECT order_num FROM orders;
END;

这个存储进程中,运用 DECLARE 句子用来界说和命名游标。存储进程处理完成后,游标就消失(因为它局限于存储进程)。


运用游标数据

运用 OPEN 句子来翻开游标,CLOSE 句子封闭游标,在一个游标被翻开后,可以运用 FETCH 句子分别拜访它的每一行。FETCH 指定检索的数据(所需的列),数据存储的方位(界说的变量)。 它还向前移动游标中的内部行指针,使下一条 FETCH 句子检索下一行(不重复读取同一行)。

DROP PROCEDURE IF EXISTS processorder;
CREATE PROCEDURE processorder()
BEGIN
    -- 界说局部变量
    DECLARE num INT;
    -- 界说游标
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
    -- 翻开游标
    OPEN ordernumbers;
    -- 获取榜首行数据
    FETCH ordernumbers INTO num;
    -- 查询成果
    SELECT num;
    -- 封闭游标
    CLOSE ordernumbers;
END;
CALL processorder();

Mysql必知必会:游标的使用

其间 FETCH 用来检索当前行的 order_num 列(将自动从榜首行开始)到一个名为 num 的局部变量中,并将查询 num 的成果。因为只检索到榜首行,所以 num 的值为 ‘20005’。

下面,循环检索数据,从榜首行到最后一行。

DROP PROCEDURE IF EXISTS processorder;
CREATE PROCEDURE processorder()
BEGIN
	-- 界说局部变量
	DECLARE done BOOLEAN DEFAULT false;
	DECLARE num INT;
	-- 界说游标
	DECLARE ordernumbers CURSOR
	FOR
	SELECT order_num FROM orders;
	-- 界说CONTINUE HANDLER
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=true;
	-- 翻开游标
	OPEN ordernumbers;
	-- 循环一切行
	REPEAT
		-- 获取榜首行数据
		FETCH ordernumbers INTO num;
	-- 完毕循环
	UNTIL done END REPEAT;
	-- 查询成果
	SELECT num;
	-- 封闭游标
	CLOSE ordernumbers;
END;
CALL processorder();

Mysql必知必会:游标的使用

循环了成果集的一切行,所以 num 的值是最后一行的数据。

与上一个比如不同之处是,这个比如的 FETCH 是在 REPEAT 内,因此它反复履行直到 done 为真。

DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done=true;

这条句子界说了一个 CONTINUE HANDLER,它是在条件出现时被履行的代码。这儿,它指出当 SQLSTATE '02000' 出现时,SET done=trueSQLSTATE '02000'是一个未找到条件,当 REPEAT 因为没有更多的行供循环而不能继续时,出现这个条件。


游标的优缺点

优点:游标是面向调集与面向行的设计思维之间的一种桥梁,因为游标是针对行操作的,所以对从数据库中 SELECT 查询得到的每一行可以进行分隔的独立的相同或不同的操作,是一种别离的思维。可以满意对某个成果行进行特别的操作。如基于游标方位的增删改查才能。

缺点

  • 速度较慢
  • 会产生死锁现象
  • 内存大

对于刚入门 Python 或是想要入门 Python 的朋友,可以经过关注大众号“Python新视野”,一起交流学习,都是重新手走过来的,有时候一个简略的问题卡很久,但可能他人的一指点就会恍然大悟,由衷的希望我们可以共同进步。另有整理的近千套简历模板,几百册电子书等你来领取哦!