MySql 遊標的使用

/*
	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;




發佈了40 篇原創文章 · 獲贊 21 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章