Tôi đang cố gắng để thực hiện một chức năng mà đệ quy xây dựng một con đường cho một loại cụ thểchức năng lưu trữ đệ quy trong MySQL
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
Khi tôi cố gắng chạy chức năng này với một thể loại mà không có cha mẹ (PARENT_ID = 0) nó hoạt động tốt nhưng khi tôi thử một loại có parent_id> 0 tôi nhận được 1424 Các hàm và trình kích hoạt được lưu trữ đệ quy không được phép.
Làm cách nào để giải quyết vấn đề này? Tôi sẽ lưu trữ mã này trên một dịch vụ lưu trữ web thông thường cần có ít nhất là phiên bản máy chủ MySQL 5.1.
Sau một số sự giúp đỡ từ Ike Walker Tôi đã thực hiện một precedure thay vào đó hoạt động tốt
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 ;
sau đó tôi sử dụng một cái gì đó như thế này để gọi nó là
CALL getPath(72, @temp); SELECT @temp;
Hiện tại tôi đang phát triển trên Ubuntu với phiên bản MySQL-Server: 5.1.41-3ubuntu12.6 (Ubuntu) – Tirithen
Tôi đã tìm thấy http: // diễn đàn .mysql.com/read.php? 98,224107,224638 # msg-224638 nói về SET max_sp_recursion_depth = N; trong đó N là số lần thu thập để cho phép. Nhưng tôi vẫn nhận được 1424 Chức năng và trình kích hoạt được lưu trữ đệ quy không được phép. – Tirithen