DECLARE cursor_name CURSOR FOR SELECT_statement;OPEN cursor_name;FETCH cursor_name INTO var_list;CLOSE cursor_name;當 FETCH 到達結果集末尾,會拋出條件,需宣告處理器避免程序終止:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
finished 為旗標變數,供迴圈判斷離開條件。
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 email_cursor CURSOR FOR
SELECT email FROM employees;
-- 宣告 NOT FOUND 處理器
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;
-- 串接信箱,分號分隔
SET email_list = CONCAT(v_email, ";", email_list);
END LOOP get_email;
CLOSE email_cursor;
END$$
DELIMITER ;
SET @email_list = "";
CALL build_email_list(@email_list);
SELECT @email_list;
SELECT → 迴圈處理 下推至伺服器端,減少網路往返。