「这是我参加2022初次更文应战的第27天,活动详情查看:2022初次更文应战」。
SQL
检索操作返回成果集,如果简略地运用 SELECT
句子,没有办法得到榜首行、下一行或前 10 行。有时,需要在检索出来的行中前进或撤退一行或多行,这便是游标的用处地点。游标(cursor
)是一个存储在 DBMS
服务器上的数据库查询, 它不是一条 SELECT
句子,而是被该句子检索出来的成果集。在存储了 游标之后,应用程序可以根据需要翻滚或浏览其间的数据。
运用游标
游标运用的进程:
- 在运用游标前,有必要声明(界说)它。这个进程实践上没有检索数据, 它只是界说要运用的
SELECT
句子和游标选项。 - 一旦声明,就有必要翻开游标以供运用。这个进程用前面界说的
SELECT
句子把数据实践检索出来。 - 对于填有数据的游标,根据需要取出(检索)各行。
- 在完毕游标运用时,有必要封闭游标,可能的话,释放游标。
声明游标后,可以根据需要频频地 翻开或封闭 游标。在游标翻开时,可根据需要频频地履行 取 操作。
留意:不像大都DBMS,MySQL游标只能用于存储进程(和函数)。
创建游标
运用 DECLEAR
来创建游标,DECLARE
命名游标,并界说相应的 SELECT
句子,根据需要带 WHERE
和 其他子句。
下面的句子界说了名为 ordernumbers
的游标,运用了可以检索一切订单的 SELECT
句子。
Order表中的信息:
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();
其间 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();
循环了成果集的一切行,所以 num
的值是最后一行的数据。
与上一个比如不同之处是,这个比如的 FETCH
是在 REPEAT
内,因此它反复履行直到 done
为真。
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done=true;
这条句子界说了一个 CONTINUE HANDLER
,它是在条件出现时被履行的代码。这儿,它指出当 SQLSTATE '02000'
出现时,SET done=true
。SQLSTATE '02000'
是一个未找到条件,当 REPEAT
因为没有更多的行供循环而不能继续时,出现这个条件。
游标的优缺点
优点:游标是面向调集与面向行的设计思维之间的一种桥梁,因为游标是针对行操作的,所以对从数据库中 SELECT
查询得到的每一行可以进行分隔的独立的相同或不同的操作,是一种别离的思维。可以满意对某个成果行进行特别的操作。如基于游标方位的增删改查才能。
缺点:
- 速度较慢
- 会产生死锁现象
- 内存大
对于刚入门 Python
或是想要入门 Python
的朋友,可以经过关注大众号“Python新视野”,一起交流学习,都是重新手走过来的,有时候一个简略的问题卡很久,但可能他人的一指点就会恍然大悟,由衷的希望我们可以共同进步。另有整理的近千套简历模板,几百册电子书等你来领取哦!