MySQL

发布于 更新于

添加存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `DeleteChildren`(IN rootId INT)BEGIN    DECLARE done INT DEFAULT 0;    DECLARE childId INT;    -- 定义游标遍历所有子节点    DECLARE cur CURSOR FOR SELECT id FROM system_menu WHERE parent_id = rootId;    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    OPEN cur;    read_loop: LOOP        FETCH cur INTO childId;        IF done THEN            LEAVE read_loop;        END IF;        -- 递归调用自身删除子节点的子节点        CALL DeleteChildren(childId);        -- 删除当前子节点        DELETE FROM system_menu WHERE id = childId;    DELETE FROM system_role_menu WHERE menu_id = childId;    END LOOP;    CLOSE cur;END

调用执行

SET SESSION max_sp_recursion_depth = 255; CALL DeleteChildren(4000);SET SESSION max_sp_recursion_depth = 0; 

FAQ

SET SESSION max_sp_recursion_depth = 255; 解决以下报错
Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine DeleteChildren

max_sp_recursion_depth 是 MySQL 的一个服务器系统变量,用于控制存储过程(Stored Procedure)允许的递归调用深度。
默认值: 0(完全禁用存储过程中的递归)最大值: 255