Sto cercando di fare una funzione che costruisce in modo ricorsivo un percorso per una specifica categoriafunzioni ricorsive memorizzati in 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
Quando si tenta di eseguire questa funzione con una categoria che non ha genitori (parent_id = 0) funziona bene ma quando provo una categoria che ha un parent_id> 0 ottengo 1424 Le funzioni memorizzate ricorsive e i trigger non sono consentiti.
Come posso aggirare questo? Ho intenzione di ospitare questo codice su un normale servizio di web hosting che dovrebbe avere almeno il server MySQL versione 5.1.
Dopo qualche aiuto da Ike Walker ho fatto un precedure, invece, che funziona bene
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 ;
allora io uso qualcosa di simile a chiamarlo
CALL getPath(72, @temp); SELECT @temp;
In questo momento sto sviluppando su Ubuntu con la versione MySQL-Server: 5.1.41-3ubuntu12.6 (Ubuntu) – Tirithen
Ho trovato http: // forums .mysql.com/read.php? 98,224107,224638 # msg-224638 che parla di SET max_sp_recursion_depth = N; dove N è il numero di ricorsi da consentire. Ma ho ancora 1424 funzioni memorizzate ricorsive e trigger non sono consentiti. – Tirithen