首页 > 代码库 > mysql 游标的使用
mysql 游标的使用
游标是什么??
游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。
使用游标
在介绍如何创建游标之前,先说明下如何使用游标。
使用游标涉及几个明确的步骤。
1、在能够使用游标前,必须先定义它。这个过程实际上是没有检索数据的,它只是定义要使用的select语句。
2、一旦你定义了游标后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。即这个步骤之后,我们就可以操作游标中的数据了。
3、对于有数据的游标,根据需要取出各行的数据来进行一定的操作。
4、使用完游标后,一定要关闭游标。
创建游标
创建一个游标的语法如下:
用declare 来定义,具体如下:
上面是定义游标的一般形式,当我们定义了一个游标之后,我们就可以来打开它、使用它、关闭它。
打开游标:
open cursor_name;
关闭游标:
close cursor_name;
使用游标:
使用游标用fetch来取出数据,例如:fetch cursor_name in variable;//取出游标所指示的数据给局部变量variable
下面这个例子就是演示了创建一个游标,打开游标及关闭游标,但没有对游标所指示的数据进行数据。
实例:操作游标中的数据
需求是这样,我们手上有一个student2表,表中的结构和数据如下:
现在我们需要将student2表中所有学生的的平均成绩(mathScore+englishScore的一半)合成一行,用逗号’,’隔开。
对于这样一个需求,下面我们尝试用游标来实现。
1 DELIMITER $$ 2 3 CREATE 4 PROCEDURE `test`.`procedure_student2`() 5 BEGIN 6 -- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。 7 DECLARE val DOUBLE DEFAULT 0; 8 DECLARE tempRes VARCHAR(10) DEFAULT ‘‘; 9 DECLARE res VARCHAR(100) DEFAULT ‘‘ ; 10 -- declare a cursor 11 DECLARE cursor_avgScore CURSOR 12 FOR 13 SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2; 14 -- declare a continue handler ,use finish while loop 15 DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET val= -1.0 ; 16 -- open cursor 17 OPEN cursor_avgScore ; 18 FETCH cursor_avgScore INTO val; 19 -- fetch cursor 20 WHILE val!=-1 DO 21 SET tempRes=CONCAT(val,‘, ‘); 22 SET res=CONCAT(res,tempRes); 23 FETCH cursor_avgScore INTO val; 24 END WHILE; 25 -- close cursor 26 CLOSE cursor_avgScore ; 27 -- 显示结果 28 SELECT res; 29 END$$ 30 31 DELIMITER ;
调用此存储过程
CALL procedure_student2();
运行结果如下:
上面这个是利用了while循环来一个一个的获取游标中的数据,在MySQL中我们还可以用repeat来做。
1 DELIMITER $$ 2 3 CREATE 4 PROCEDURE `test`.`procedure_student_v1`() 5 BEGIN 6 -- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。 7 DECLARE val DOUBLE DEFAULT 0; 8 DECLARE tempRes VARCHAR(10) DEFAULT ‘‘; 9 DECLARE res VARCHAR(100) DEFAULT ‘‘ ; 10 -- declare a cursor 11 DECLARE cursor_avgScore CURSOR 12 FOR 13 SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2; 14 -- declare a continue handler ,use finish while loop 15 DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET val= -1.0 ; 16 -- open cursor 17 OPEN cursor_avgScore ; 18 -- fetch cursor 19 REPEAT 20 FETCH cursor_avgScore INTO val; 21 IF val!=-1 THEN 22 SET tempRes=CONCAT(val,‘, ‘); 23 SET res=CONCAT(res,tempRes); 24 END IF; 25 UNTIL val=-1 END REPEAT; -- 居然MySQL中 用 val=-1 来结束循环,原以为应该和java、c类似,用val==-1来结束。 26 -- close cursor 27 CLOSE cursor_avgScore ; 28 -- 显示结果 29 SELECT res; 30 END$$ 31 32 DELIMITER ;
转自:http://blog.csdn.net/u010412719/article/details/51125496
mysql 游标的使用