• 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

  • 相关阅读:
    远程连接桌面报:这可能是由于credssp加密oracle修正
    MVC断点续传
    [COCI2011-2012#5] POPLOCAVANJE 后缀自动机
    [SDOI2016]生成魔咒 后缀自动机
    [JSOI2009]密码 AC自动机
    CF17E Palisection manacher
    [JSOI2007]字符加密 后缀数组
    [POI2012]OKR-A Horrible Poem hash
    [APIO2014]回文串 manacher 后缀数组
    [SHOI2011]双倍回文 manacher
  • 原文地址:https://www.cnblogs.com/lmaster/p/6373496.html
Copyright © 2020-2023  润新知