mysql 定义游标_mysql 游标的使用

游标是什么??

游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。

使用游标

在介绍如何创建游标之前,先说明下如何使用游标。

使用游标涉及几个明确的步骤。

1、在能够使用游标前,必须先定义它。这个过程实际上是没有检索数据的,它只是定义要使用的select语句。

2、一旦你定义了游标后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。即这个步骤之后,我们就可以操作游标中的数据了。

3、对于有数据的游标,根据需要取出各行的数据来进行一定的操作。

4、使用完游标后,一定要关闭游标。

创建游标

创建一个游标的语法如下:

用declare 来定义,具体如下:

MySQL_cursor_v01.PNG

上面是定义游标的一般形式,当我们定义了一个游标之后,我们就可以来打开它、使用它、关闭它。

打开游标:

open cursor_name;

关闭游标:

close cursor_name;

使用游标:

使用游标用fetch来取出数据,例如:fetch cursor_name in variable;//取出游标所指示的数据给局部变量variable

下面这个例子就是演示了创建一个游标,打开游标及关闭游标,但没有对游标所指示的数据进行数据。

MySQL_cursor_v1.PNG

实例:操作游标中的数据

需求是这样,我们手上有一个student2表,表中的结构和数据如下:

MySQL_cursor_v2.PNG

现在我们需要将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 FROMstudent2;14 --declare a continue handler ,use finish while loop

15 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET val= -1.0;16 --open cursor

17 OPENcursor_avgScore ;18 FETCH cursor_avgScore INTOval;19 --fetch cursor

20 WHILE val!=-1DO21 SET tempRes=CONCAT(val,',');22 SET res=CONCAT(res,tempRes);23 FETCH cursor_avgScore INTOval;24 END WHILE;25 --close cursor

26 CLOSEcursor_avgScore ;27 --显示结果

28 SELECTres;29 END$$30

31 DELIMITER ;

调用此存储过程

CALL procedure_student2();

运行结果如下:

MySQL_cursor_v4.PNG

上面这个是利用了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 FROMstudent2;14 --declare a continue handler ,use finish while loop

15 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET val= -1.0;16 --open cursor

17 OPENcursor_avgScore ;18 --fetch cursor

19 REPEAT20 FETCH cursor_avgScore INTOval;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 CLOSEcursor_avgScore ;28 --显示结果

29 SELECTres;30 END$$31

32 DELIMITER ;

转自:http://blog.csdn.net/u010412719/article/details/51125496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值