/* MySQL 存儲過程編寫以及遊標的使用 NonkeyJiang 2017-09-14 */ DROP TABLE IF EXISTS tbl_a; CREATE TABLE tbl_a ( ID INT, NAME_A VARCHAR(20) ); TRUNCATE tbl_a; INSERT INTO tbl_a VALUES (1,'a'), (2,'ab'), (3,'abc'), (4,'abcd'), (5,'abcde'); DROP PROCEDURE IF EXISTS simpleproc; delimiter $$ CREATE PROCEDURE simpleproc(OUT cids VARCHAR(64),OUT cnames VARCHAR(64)) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE cid VARCHAR(20); DECLARE cname VARCHAR(20); /* DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; DECLARE cur1 CURSOR FOR SELECT ID,NAME_A FROM tbl_a; 如果設置done 變量在聲明遊標前,則會報錯 [Err] 1338 - Cursor declaration after handler declaration */ DECLARE cur1 CURSOR FOR SELECT ID,NAME_A FROM tbl_a; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; /* 遍歷遊標必須在每次FETCH 後判斷done ,否則將會吧最後一條記錄多遍歷一次 */ OPEN cur1; label:LOOP FETCH cur1 INTO cid,cname; IF done THEN LEAVE label;END IF; SET cids = CONCAT_WS(',',cids,cid); SET cnames = CONCAT_WS(',',cnames,cname); END LOOP label; CLOSE cur1; END $$ delimiter ; call simpleproc(@cids,@cnames); SELECT @cids; SELECT @cnames;