CREATE PROCEDURE `justifyGroupNum`()
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
/* 調用方式:CALL justifyGroupNum() */
DECLARE p_group_id INT;
DECLARE p_num INT;
DECLARE stopFlag INT DEFAULT 0;
DECLARE cursor_name CURSOR FOR
SELECT c_group_id, COUNT(*) AS num
FROM `t_group_member`
WHERE c_valid IN (3,4)
GROUP BY c_group_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopFlag = 1;
OPEN cursor_name;
REPEAT
FETCH cursor_name INTO p_group_id, p_num;
BEGIN
UPDATE t_groupinfo
SET c_member_number = p_num
WHERE c_group_id = p_group_id;
END;
UNTIL stopFlag = 1
END REPEAT;
CLOSE cursor_name;
END;
DECLARE cursor_name CURSOR FOR SELECT ... 定義結果集。DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopFlag = 1; —— 必須,否則 FETCH 結束時拋出異常導致過程終止。stopFlag 退出。WHILE 同理需先 FETCH 再判斷。CLOSE 釋放資源。CALL justifyGroupNum();NOT FOUND HANDLER → 游標讀完報錯「No data to FETCH」。CLOSE 游標 → 連接洩漏,佔用服務端資源。UPDATE ... JOIN (SELECT ...))。UPDATE t_groupinfo g
JOIN (
SELECT c_group_id, COUNT(*) AS num
FROM t_group_member
WHERE c_valid IN (3,4)
GROUP BY c_group_id
) m ON g.c_group_id = m.c_group_id
SET g.c_member_number = m.num;
單條 SQL 替代游標循環,原子性更強、性能更高、代碼更簡潔。