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.html,html
其中declare handler的語法見 http://dev.mysql.com/doc/refman/5.7/en/declare-handler.html,mysql
在調試過程當中,咱們可能會須要像oracle那樣使用dbms_output輸出語句,在mysql中,咱們使用 SELECT CONCAT("s_like_cursor executed ",done);來代替。sql