Mysql進階——遊標

什麼是遊標

遊標字面理解就是遊動的光標。遊標是SQL的一個內存工作區,由系統或用戶以變量的形式定義。在某些情況下,需要把數據從存放在磁盤的表中調到計算機內存中進行處理,最後將處理結果顯示出來或最終寫回數據庫。這樣數據處理的速度才會提高,否則頻繁的磁盤數據交換會降低效率。用數據庫語言來描述遊標就是映射在結果集中一行數據上的位置實體,有了遊標,用戶就可以訪問結果集中的任意一行數據了,將遊標放置到某行後,即可對該行數據進行操作,例如提取當前行的數據等。增加了數據庫對行數據處理的靈活性。 

Mysql進階——遊標

遊標工作示意圖

其中有個指針的概念,指針指向了當前行記錄的信息,在遊標的處理過程中通過移動指針進行逐行讀取數據。要明白的是,遊標一般結合存儲過程或存儲函數或觸發器進行使用。

遊標定義語法

-- 聲明遊標 ,cursor_name表示遊標名,CURSOR FOR是固定寫法,SELECT即select語句
DECLARE cursor_name CURSOR FOR SELECT 語句;
-- 打開遊標
OPEN cursor_name;
-- 從遊標指針中獲取數據
FETCH cursor_name INTO 變量名 [,變量名2,...];
--關閉遊標
CLOSE cursor_namesh

示例及測試

使用前文的user表,使用遊標取出所有的username

Mysql進階——遊標

遊標使用示例

語句釋義:

#創建存儲過程,定義輸出變量result
create procedure sp_cursor_test(OUT result text)
#開始
begin
#聲明標識變量用於判斷是否退出循環
declare flag bit default 0;
#定義臨時存儲變量,用來存儲每行取到的username
declare tmp varchar(50);
#定義遊標
declare cur cursor for select distinct username from user;
#聲明異常
declare continue handler for not found set flag=1;
#開啟遊標
open cur;
#開始循環
while flag !=1 do
#將cur取到的username賦給tmp
fetch cur into tmp;
#判斷標識的值
if flag !=1 then
#將tmp的值拼接給result
set result=concat_ws(',',result,tmp);
#結束判斷
end if;
#結束循環
end while;
#關閉遊標
close cur;
end //

如果需要查詢user中多個字段,則聲明多個tmp字段並在獲取數據時以fetch cur into tmp [,tmp2,tmp3,...];形式即可,請注意在使用遊標前必須先打開,使用open cur;語句,而且只有在打開遊標後前面定義的select語句開正式開始執行。循環獲取cur中的數據使用了while流程語句。

declare continue handler for not found set flag = 1; --異常處理並設置flag=1

在發生not found 的異常時將flag設置為1,並通過聲明為continue而讓程序繼續執行。這樣處理的理由是fetch cur into tmp語句執行時,如果遊標的指針無法讀取下一行數據時就會拋出NOT FOUND異常,拋出後由已聲明的異常程序處理,並設置flag為1,以此來結束循環,注意拋出異常後程序還會繼續執行,畢竟聲明瞭continue。所以最後一次判斷if flag !=1 then是必要的。最後執行完成,通過close cur 關閉遊標,這樣整個遊標的使用就完成了

由此我們可以看到遊標的操作步驟:

1.聲明遊標 2.打開遊標 3.提取數據 4.關閉遊標

其一般和存儲過程或者存儲函數結合使用,由於一般使用較少,很少提及。但是它是你在面試時的加分項哦。

記得收藏和點波關注,謝謝美女、帥哥的支持。


分享到:


相關文章: