儲存過程如何迴圈呼叫
「來源: |SQL資料庫開發 ID:sql_road」
設為“置頂或星標
”,第一時間送達乾貨
SQL專欄
SQL基礎知識第二版
SQL高階知識第二版
什麼是遊標?
遊標(cursor)是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。在儲存了遊標之後,應用程式可以根據需要滾動或瀏覽其中的資料。
注意:MySQL遊標只能用於儲存過程(和函式)。
建立遊標
在建立一個遊標前,我們需要先清除遊標的語法
1、定義遊標
DECLARE 遊標名稱 CURSOR FOR SQL語句;
2、開啟遊標
OPEN 遊標名稱;
3、獲取結果
FETCH 遊標名稱 INTO 變數名稱[,變數名稱];
4、關閉遊標
CLOSE 遊標名稱;
我們以Customers表來作為示例
示例一
定義一個儲存過程,呼叫的時候執行裡面的遊標
CREATEPROCEDURE PROC1()BEGIN—— 定義兩個存放結果的變數DECLARENAMEVARCHAR(20);DECLARE ADDR VARCHAR(50);—— 宣告遊標DECLARE MY CURSORFORSELECT 姓名,地址 FROM customers;—— 開啟遊標 OPEN MY;—— 獲取結果 FETCH MY INTO NAME,ADDR;—— 這裡是為了顯示獲取結果SELECTNAME,ADDR;—— 關閉遊標 CLOSE MY; END;
我們執行完上面的儲存過程後,就可以呼叫該儲存過程了
CALL PROC1();
得到結果:
這裡肯定有小夥伴好奇,customers表裡明明有7條記錄,為什麼只顯示了1條記錄?
這是因為遊標的變數只保留了customers表中的第一行資料,如果要檢視後面的資料,就需要迴圈往下移動遊標,才能繼續檢視。
示例二
定義一個儲存過程,呼叫儲存過程時,將表customers裡的資料迴圈寫入新的表裡面。
CREATEPROCEDURE PROC2()BEGIN—— 定義兩個存放結果的變數DECLARE FLAG INTDEFAULT0; DECLARENAMEVARCHAR(20);DECLARE ADDR VARCHAR(50);—— 宣告遊標DECLARE MY CURSORFORSELECT 姓名,地址 FROM customers;
DECLARE CONTINUE HANDLERFORNOTFOUNDSET FLAG=1;—— 開啟遊標 OPEN MY;—— 迴圈體部分 L1:LOOP—— 獲取結果 FETCH MY INTO NAME,ADDR; IF FLAG=1 THEN LEAVE L1;ENDIF;—— 這裡是為了顯示獲取結果INSERTINTO cus VALUES(NAME,ADDR);—— 關閉遊標ENDLOOP; —— 結束迴圈 CLOSE MY; END;
然後我們執行這個儲存過程,並查詢cus表裡的資料
CALL PROC2();SELECT * FROM cus;
結果:
結果與customers裡的一致,但是這些結果是迴圈一條一條往下移動的過程中插入的,即這個迴圈執行了7次。
以上就是遊標的基本操作原理了,此外遊標的迴圈體還有WHILE,REPEAT等操作方式,他們的操作方式與LOOP類似,都是用來迴圈執行迴圈體裡面的內容,直到迴圈結束。
以上就是MySQL遊標的相關內容,覺得不錯記得幫忙轉發+在看~
最後給大家分享我寫的SQL兩件套:
《SQL基礎知識第二版》
和
《SQL高階知識第二版》
的PDF電子版。裡面有各個語法的解釋、大量的例項講解和批註等等,非常通俗易懂,方便大家跟著一起來實操。