MySQL检索操作返回一组称为结果集的行。这组返回的行都是与SQL语句相匹配的行。使用简单的SELECT语句无法得到第一行、下一行和前十行。有时候需要在检索出来的结果中前进或后退一行或多行。这就是使用游标的原因。游标(cursor)是一个存储在MySQL服务器上的数据库查询它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了cursor之后,应用程序可以根据需要滚动或浏览其中的数据。
游标的主要作用是用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
需要注意的是:在MYSQL中游标只能使用与存储过程中。
使用游标的几个明确的步骤:
1.在能够使用游标前,必须声明它。这个过程实际上是没有检索数据的,它只是定义要使用的SELECT 语句。
2.一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把实际检索出来。
3.对填有数据的游标,根据需要取出各行。
4.在结束游标使用时,必须关闭游标。
创建游标
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR FOR SELECT order_num FROM ORDERS;
END;
打开游标:open ordernumbers; 关闭游标:close ordernumbers;如果你不明确关闭游标,MySQL将会在到达END语句时自动关闭它。
使用游标数据:
在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部指针,使下一条FETCH语句检索下一行(不重复读取同一行)。
CREATE PROCEDURE processorders()
BEGIN
--Declare local variables
DECLARE o INT;
--Declare the cursor
DECLARE ordernumbers CURSOR FOR SELECT order_num FORM orders;
--Open the cursor
OPEN orderitems;
--Get order number
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END ;
其中FETCH用来检索当前行的order_num列(将自动从第一行开始)到一个名为o的局部声明的变量 中。对检索出的数据不做任何处理。
下面是循环检索数据从第一行到最后一行:
CREATE PROCEDURE processoders()
BEGIN
--Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
--Decalre the cursor
DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;
--Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '0200' SET done=1;
//它是指当SQLSTATE' 02000' 出现的时候 设置done的值为1.
OPEN ordernubers;
--LOOP through all rows
REPEAT
--Get order number
FETCH ordernumbers INTO o;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END;
需要注意的是:DECLARE 语句定义的局部变量必须在定义任意游标或句柄之前定义,而句柄必须在游标之后定义。