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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM