游標是什么??
游標是一個存儲在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
