mysql儲存過程使用遞迴
阿新 • • 發佈:2019-01-26
實現功能為查詢節點所有子節點同時更新子節點資料,用遞迴進行處理。測試時始終報錯:
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);