標籤:res 聲明 顯示 concat 分享 title finish alt stat
遊標是什嗎??
遊標是一個儲存在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 cursor11 DECLARE cursor_avgScore CURSOR12 FOR13 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 cursor17 OPEN cursor_avgScore ;18 FETCH cursor_avgScore INTO val;19 -- fetch cursor20 WHILE val!=-1 DO21 SET tempRes=CONCAT(val,‘, ‘);22 SET res=CONCAT(res,tempRes);23 FETCH cursor_avgScore INTO val;24 END WHILE; 25 -- close cursor26 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 cursor11 DECLARE cursor_avgScore CURSOR12 FOR13 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 cursor17 OPEN cursor_avgScore ; 18 -- fetch cursor19 REPEAT 20 FETCH cursor_avgScore INTO val;21 IF val!=-1 THEN22 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 cursor27 CLOSE cursor_avgScore ;28 -- 顯示結果29 SELECT res;30 END$$31 32 DELIMITER ;
轉自:http://blog.csdn.net/u010412719/article/details/51125496
mysql 遊標的使用