1. 程式人生 > >mysql儲存過程使用遞迴

mysql儲存過程使用遞迴

實現功能為查詢節點所有子節點同時更新子節點資料,用遞迴進行處理。測試時始終報錯:

Error Code : 1456  Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine pro_app_rs_right_update···

樹的深度不超過10,怎麼可能深度出問題,於是百度了一下,網上給瞭解決方案,加上下面程式碼就ok:

SET @@max_sp_recursion_depth = 100;

下面是mysql遞迴呼叫的原始碼:

DROP PROCEDURE IF EXISTS pro_app_rs_right_update_role;
DELIMITER//
CREATE PROCEDURE pro_app_rs_right_update_role(
	IN uid VARCHAR(225),
	IN nCount INT)
BEGIN
	
	DECLARE id VARCHAR(225);
	DECLARE nLevel INT;
	DECLARE STOP INT DEFAULT 0;
	
	# 宣告遊標,查詢id和許可權水平
	DECLARE cur CURSOR FOR SELECT app_rs_right.id, app_rs_right.LEVEL FROM app_rs_right 
	WHERE app_rs_right.pid = uid;

	# 宣告遊標的異常處理,設定一個終止標記
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET STOP = 1;
	
	SET @@max_sp_recursion_depth = 100;
	# 開啟遊標
	OPEN cur;
	
	# 讀取一行資料到遊標中
	FETCH cur INTO id, nLevel;
	
	# 判斷是否已經到達最後一行資料
	WHILE STOP <> 1 DO 
		
		CALL pro_app_rs_right_update_role(id, nCount);
		UPDATE app_rs_right SET app_rs_right.level = app_rs_right.level + nCount 
		WHERE app_rs_right.id = id;
		
		FETCH cur INTO id, nLevel;
	END WHILE;
	CLOSE cur;
END //

# select id, level from app_rs_right where pid = '402881f53fe18bbc013fe19eda7f0003';
# call pro_app_rs_right_update_role('402881f53fe18bbc013fe19eda7f0003', 10);