Mysql 存儲過程 遊標 例子

CREATE PROCEDURE solution_relative_pro()
BEGIN
	DECLARE done INT DEFAULT FALSE;
	DECLARE sid varchar(32);
	DECLARE rn int;
	DECLARE s_reply_cursor CURSOR FOR 
		select r.tid,count(1) as rn
		from tbl_cms_reply r
		where r.best = 3 and r.isdelete = 0
		group by r.tid;
	DECLARE s_like_cursor CURSOR FOR
		select l.target_id,count(1) as rn
		from tbl_cms_like l
		where l.like_type = 1 and l.`status` = 1
		group by l.target_id;
	DECLARE s_collect_cursor CURSOR FOR
		select c.target_id,count(1) as rn
		from tbl_cms_collection c
		where c.collect_type = 0 and c.`status` = 1
		group by c.target_id;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

	OPEN s_reply_cursor;
	read_loop:LOOP
		FETCH s_reply_cursor INTO sid,rn;
		IF done THEN
			LEAVE read_loop;
		END IF;
                update tbl_cms_solution s set s.reply = rn where s.id = sid;
	END LOOP;
	CLOSE s_reply_cursor;
	
	SET done = 0;
	SELECT CONCAT("s_reply_cursor executed ",done);
	
	OPEN s_like_cursor;
	read_loop:LOOP
		FETCH s_like_cursor INTO sid,rn;
		IF done THEN
			LEAVE read_loop;
		END IF;
		update tbl_cms_solution s set s.`like` = rn where s.id = sid;
	END LOOP;
	CLOSE s_like_cursor;

	SET done = 0;
	SELECT CONCAT("s_like_cursor executed ",done);

	OPEN s_collect_cursor;
	read_loop:LOOP
		FETCH s_collect_cursor INTO sid,rn;
		IF done THEN
			LEAVE read_loop;
		END IF;
		update tbl_cms_solution s set s.collect = rn where s.id = sid;
	END LOOP;
	CLOSE s_collect_cursor;

END

以前一直用Oracle,第一次寫mysql的存儲過程,語法不太一致,參考mysql官方文檔 http://dev.mysql.com/doc/refman/5.7/en/cursors.htmlhtml

其中declare handler的語法見 http://dev.mysql.com/doc/refman/5.7/en/declare-handler.htmlmysql

在調試過程當中,咱們可能會須要像oracle那樣使用dbms_output輸出語句,在mysql中,咱們使用 SELECT CONCAT("s_like_cursor executed ",done);來代替。sql

相關文章
相關標籤/搜索