zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/lmaster/p/6373496.html
Copyright © 2011-2022 走看看