mysql递归

SuperCustomer 2015-07-20 06:08:56
依赖关系表:t_task_link(task_id int, task_pid int);
依赖关系为一个有向无环图,例如:


当添加依赖关系时需要检测是否有回路,下面是我写的存储过程,有的能能正确检测,有的却不行,希望高手指点
-- 检查任务依赖是否有回路
DROP PROCEDURE IF EXISTS check_loop;
CREATE PROCEDURE check_loop (in_task_id INT, in_task_pid INT, OUT out_status TINYINT)
BEGIN
DECLARE _task_id INT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT task_pid FROM t_task_link WHERE task_id = in_task_pid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;
read_loop : LOOP
FETCH cur INTO _task_id;
IF in_task_id = _task_id THEN
SET out_status = 1;
SET done = TRUE;
END IF;

IF done THEN
LEAVE read_loop;
END IF;

CALL check_loop (in_task_id, _task_id, @out_status);
END LOOP;
CLOSE cur;
END;

DROP PROCEDURE IF EXISTS exists_loop;
CREATE PROCEDURE exists_loop (in_task_id INT, in_task_pid INT)
BEGIN
SET @@max_sp_recursion_depth = 255;
CALL check_loop (in_task_id, in_task_pid, @out_status);
SELECT IFNULL(@out_status, 0);
END;

...全文
58 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧