我正在尝试制作一个可为特定类别递归构建路径的函数
CREATE FUNCTION getPath(inId INT) RETURNS TEXT DETERMINISTIC BEGIN DECLARE return_path TEXT; DECLARE return_parent_id INT; SELECT CONCAT('/', name) INTO return_path FROM article_categories WHERE id = inId; SELECT parent_id INTO return_parent_id FROM article_categories WHERE id = inId; IF return_parent_id > 0 THEN SELECT CONCAT(getPath(return_parent_id), return_path) INTO return_path; END IF; RETURN return_path; END
当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它可以正常工作,但是当我尝试使用parent_id> 0的类别时,我得到1424递归存储的函数和触发器是不允许的。
我该如何解决?我将在常规的Web托管服务上托管此代码,该服务至少应具有MySQL服务器版本5.1。
在Ike Walker的帮助下,我做了一个程序,但是效果很好
DROP PROCEDURE IF EXISTS getPath; DELIMITER // CREATE PROCEDURE getPath(IN category_id INT UNSIGNED, OUT return_path TEXT) BEGIN DECLARE parent_id INT UNSIGNED; DECLARE path_result TEXT; SET max_sp_recursion_depth=50; SELECT CONCAT('/', ac.name), ac.parent_id INTO return_path, parent_id FROM article_categories AS ac WHERE ac.id = category_id; IF parent_id > 0 THEN CALL getPath(parent_id, path_result); SELECT CONCAT(path_result, return_path) INTO return_path; END IF; END // DELIMITER ;
然后我用这样的东西来称呼它
CALL getPath(72, @temp); SELECT @temp;
即使设置了max_sp_recursion_depth,MySQL也不允许递归功能。
如果您设置max_sp_recursion_depth,则它的过程中最多允许255个递归。
因此,我建议您使用一个INOUT变量作为return_path的过程替换您的函数。