gpt4 book ai didi

sql - MySQL 中的递归存储函数

转载 作者:可可西里 更新时间:2023-11-01 06:36:06 25 4
gpt4 key购买 nike

我正在尝试制作一个递归地为特定类别构建路径的函数

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。


在 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 不允许递归函数,即使您设置了 max_sp_recursion_depth。

如果您设置 max_sp_recursion_depth,它确实允许在 PROCEDURE 中进行最多 255 次递归。

因此我建议您将函数替换为一个过程,使用一个 INOUT 变量作为 return_path。

关于sql - MySQL 中的递归存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com