本文實例講述了mysql存儲過程之游標(DECLARE)原理與用法。分享給大家供大家參考,具體如下:
我們在處理存儲過程中的結果集時,可以使用游標,因為游標允許我們迭代查詢返回的一組行,并相應地處理每行。mysql的游標為只讀,不可滾動和敏感三種模式,我們來看下:
- 只讀:無法通過光標更新基礎表中的數據。
- 不可滾動:只能按照select語句確定的順序獲取行。不能以相反的順序獲取行。 此外,不能跳過行或跳轉到結果集中的特定行。
- 敏感:有兩種游標:敏感游標和不敏感游標。敏感游標指向實際數據,不敏感游標使用數據的臨時副本。敏感游標比一個不敏感的游標執行得更快,因為它不需要臨時拷貝數據。但是,對其他連接的數據所做的任何更改都將影響由敏感游標使用的數據,因此,如果不更新敏感游標所使用的數據,則更安全。 MySQL游標是敏感的。
我們可以在存儲過程,存儲函數和觸發器中使用MySQL游標,咱們先來看下使用DECLARE語句聲明的語法:
DECLARE cursor_name CURSOR FOR SELECT_statement;
我們要注意下,游標聲明必須在變量聲明之后。如果在變量聲明之前聲明游標,mysql將會發出一個錯誤,另外游標必須始終與SELECT語句相關聯。完事呢,我們來使用OPEN語句打開游標。OPEN語句初始化游標的結果集,因此我們必須在從結果集中提取行之前調用OPEN語句:
然后,我們來使用FETCH語句來檢索光標指向的下一行,并將光標移動到結果集中的下一行:
FETCH cursor_name INTO variables list;
之后,我們就可以檢查是否有任何行記錄可用,然后再提取它。完事最后還要記得調用CLOSE語句來停用光標并釋放與之關聯的內存:
我們要知道,當光標不再使用時,應該關閉它。當我們使用mysql游標時,還必須聲明一個NOT FOUND處理程序來處理當游標找不到任何行時的情況。 因為每次調用FETCH語句時,游標會嘗試讀取結果集中的下一行。 當光標到達結果集的末尾時,它將無法獲得數據,并且會產生一個條件。NOT FOUND處理程序用于處理這種情況,我們來看下它的語法結構:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
finished是一個變量,指示光標到達結果集的結尾。請注意,處理程序聲明必須出現在存儲過程中的變量和游標聲明之后。我們再來看下mysql游標的運行原理圖:

咱們接下來,就要開發一個存儲過程用來獲取employees表中所有員工的電子郵件列表。我們先來聲明一些變量,一個用于循環員工電子郵件的游標和一個NOT FOUND處理程序:
DECLARE finished INTEGER DEFAULT 0;
DECLARE email varchar(255) DEFAULT "";
-- declare cursor for employee email
DEClARE email_cursor CURSOR FOR
SELECT email FROM employees;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
接下來,使用OPEN語句打開email_cursor:
OPEN email_cursor;
然后,迭代電子郵件列表,并使用分隔符(;)連接每個電子郵件:
get_email: LOOP
FETCH email_cursor INTO v_email;
IF v_finished = 1 THEN
LEAVE get_email;
END IF;
-- build email list
SET email_list = CONCAT(v_email,";",email_list);
END LOOP get_email;
之后,我們在循環中,使用v_finished變量來檢查列表中是否有任何電子郵件來終止循環,完事呢,使用CLOSE語句關閉游標:
我們來看下build_email_list存儲過程所有代碼:
DELIMITER $$
CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_email varchar(100) DEFAULT "";
-- declare cursor for employee email
DEClARE email_cursor CURSOR FOR
SELECT email FROM employees;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN email_cursor;
get_email: LOOP
FETCH email_cursor INTO v_email;
IF v_finished = 1 THEN
LEAVE get_email;
END IF;
-- build email list
SET email_list = CONCAT(v_email,";",email_list);
END LOOP get_email;
CLOSE email_cursor;
END$$
DELIMITER ;
我們來使用以下腳本測試build_email_list存儲過程:
SET @email_list = "";
CALL build_email_list(@email_list);
SELECT @email_list;
至于結果,咱就不贅述了哈。
更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》及《MySQL數據庫鎖相關技巧匯總》
希望本文所述對大家MySQL數據庫計有所幫助。
您可能感興趣的文章:- MySQL 游標的定義與使用方式
- Mysql 存儲過程中使用游標循環讀取臨時表
- mysql聲明游標的方法
- 詳解Mysql 游標的用法及其作用
- mysql游標的原理與用法實例分析
- 帶你徹底搞懂python操作mysql數據庫(cursor游標講解)
- MySQL游標概念與用法詳解
- mysql的存儲過程、游標 、事務實例詳解
- Mysql存儲過程中游標的用法實例
- Mysql存儲過程循環內嵌套使用游標示例代碼
- MySQL存儲過程中游標循環的跳出和繼續操作示例
- MySQL 游標的作用與使用相關