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