mysql 遊標的使用

來源:互聯網
上載者:User

標籤: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 遊標的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.