MySQL游標(biāo)簡介【8】
使用MySQL游標(biāo)
首先,必須使用DECLARE語句聲明游標(biāo):
DECLARE cursor_name CURSOR FOR SELECT_statement;
游標(biāo)聲明必須在變量聲明之后。如果在變量聲明之前聲明游標(biāo),MySQL將會發(fā)出一個錯誤。游標(biāo)必須始終與SELECT語句相關(guān)聯(lián)。
接下來,使用OPEN語句打開游標(biāo)。OPEN語句初始化游標(biāo)的結(jié)果集,因此您必須在從結(jié)果集中提取行之前調(diào)用OPEN語句。
OPEN cursor_name;
然后,使用FETCH語句來檢索光標(biāo)指向的下一行,并將光標(biāo)移動到結(jié)果集中的下一行。
FETCH cursor_name INTO variables list;
之后,可以檢查是否有任何行記錄可用,然后再提取它。
最后,調(diào)用CLOSE語句來停用光標(biāo)并釋放與之關(guān)聯(lián)的內(nèi)存,如下所示:
CLOSE cursor_name;
當(dāng)光標(biāo)不再使用時,應(yīng)該關(guān)閉它。
當(dāng)使用MySQL游標(biāo)時,還必須聲明一個NOT FOUND處理程序來處理當(dāng)游標(biāo)找不到任何行時的情況。 因?yàn)槊看握{(diào)用FETCH語句時,游標(biāo)會嘗試讀取結(jié)果集中的下一行。 當(dāng)光標(biāo)到達(dá)結(jié)果集的末尾時,它將無法獲得數(shù)據(jù),并且會產(chǎn)生一個條件。 處理程序用于處理這種情況。
要聲明一個NOT FOUND處理程序,參考以下語法:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
finished是一個變量,指示光標(biāo)到達(dá)結(jié)果集的結(jié)尾。請注意,處理程序聲明必須出現(xiàn)在存儲過程中的變量和游標(biāo)聲明之后。
MySQL游標(biāo)示例
為了更好地演示,我們將開發(fā)一個存儲過程,來獲取MySQL示例數(shù)據(jù)庫(yiibaidb)中employees表中所有員工的電子郵件列表。
首先,聲明一些變量,一個用于循環(huán)員工電子郵件的游標(biāo)和一個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;
之后,在循環(huán)中,使用v_finished變量來檢查列表中是否有任何電子郵件來終止循環(huán)。
最后,使用CLOSE語句關(guān)閉游標(biāo):
CLOSE email_cursor;
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;

浙公網(wǎng)安備 33010602011771號