【发布时间】:2011-04-14 16:53:26
【问题描述】:
我正在尝试创建一个函数来递归地为特定类别构建路径
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 递归存储函数和触发器是不允许的。
我该如何解决这个问题?我将将此代码托管在至少应具有 MySQL 服务器版本 5.1 的常规 Web 托管服务上。
在 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;
【问题讨论】:
-
现在我正在使用 MySQL-Server 版本的 Ubuntu 上进行开发:5.1.41-3ubuntu12.6 (Ubuntu)
-
我发现forums.mysql.com/read.php?98,224107,224638#msg-224638 谈到了 SET max_sp_recursion_depth=N;其中 N 是允许的递归次数。但我仍然得到 1424 Recursive stored functions and triggers are not allowed.
标签: sql mysql recursion recursive-query stored-functions