Hallo zusammen
Ich bin gerade dran meine rekursive Funktion in eine MySQL Stored Procedure umzuformen (Stored Function kann ich scheinbar nicht verwenden, da Trigger in der gleichen DB sind...?)
Deshalb wird die Wertübergabe nun über eine String-Variable OUT (also by Reference wenn man so will) erfolgen.
Und: Die Funktion sollte rekursiv aufgebaut bleiben, ich weiss es gibt andere (evtl. bessere) Möglichkeiten das zu bewerkstelligen. (Ist halt nicht so performant, da immer wieder SELECT's abgesetzt werden, schon klar...)
"str" ist die variable welchee immer wieder neu übergeben wird und am schluss "by reference" geholt wird:
Aufruf zum testen in der Konsole:
Wenn ich nur 1 Ebene unter dem "Hauptknoten" habe, klappt alles. Ausgabe:
Wenn ich aber 2 Ebenen habe...
...komme eine Fehlermeldung ich solle den "thread_stack" erhöhen.
Ich frage mich, ob meine Funktion falsch ist, oder ob ich wirklich den "thread_stack" erhöhen muss?
Die gleiche Sache hatte ich hier mit SQL Server, da habe ich aber letztendlich eine UDF verwendet: https://www.datenbankforum.com/thre...men-und-per-varchar-max-output-ausgeben.2518/
Grüsse, Jan
Ich bin gerade dran meine rekursive Funktion in eine MySQL Stored Procedure umzuformen (Stored Function kann ich scheinbar nicht verwenden, da Trigger in der gleichen DB sind...?)
Deshalb wird die Wertübergabe nun über eine String-Variable OUT (also by Reference wenn man so will) erfolgen.
Und: Die Funktion sollte rekursiv aufgebaut bleiben, ich weiss es gibt andere (evtl. bessere) Möglichkeiten das zu bewerkstelligen. (Ist halt nicht so performant, da immer wieder SELECT's abgesetzt werden, schon klar...)
"str" ist die variable welchee immer wieder neu übergeben wird und am schluss "by reference" geholt wird:
Code:
DELIMITER //
DROP PROCEDURE IF EXISTS `getNestedXMLTree`;
CREATE PROCEDURE `getNestedXMLTree` (IN parentNodeID INT, OUT str VARCHAR(21844) CHARACTER SET utf8)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE _adr_id INT;
DECLARE _nachname VARCHAR(64);
DECLARE _nodeOf INT;
DECLARE _cur CURSOR FOR
SELECT
adressen.adr_id,
adressen.nachname,
adressen.nodeOf
FROM
CUST_v_adressen adressen
WHERE
adressen.nodeOf
ORDER BY
adressen.adr_id ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @@SESSION.max_sp_recursion_depth = 255;
IF ISNULL(str) THEN
SET str = '';
END IF;
OPEN _cur;
_loop: LOOP
FETCH _cur INTO _adr_id, _nachname, _nodeOf;
IF done THEN
LEAVE _loop;
END IF;
IF (SELECT COUNT('') FROM CUST_v_adressen adressen WHERE adressen.nodeOf = _adr_id) > 0 THEN
SET str = CONCAT(str, CONCAT('<entry value="', CONCAT(_nachname,'">')));
CALL getNestedXMLTree(_adr_id, str);
SET str = CONCAT(str, '</entry>');
ELSE
SET str = CONCAT(str, CONCAT('<entry value="', CONCAT(_nachname, '" />')));
END IF;
END LOOP;
CLOSE _cur;
END; //
DELIMITER ;
Aufruf zum testen in der Konsole:
Code:
CALL getNestedXMLTree(1,@str);
SELECT @str;
Wenn ich nur 1 Ebene unter dem "Hauptknoten" habe, klappt alles. Ausgabe:
HTML:
<entry value="Jäggi" /><entry value="*" /><entry value="Simoes" /><entry value="Nünlist" /><entry value="Byland" /><entry value="Elbe" />
Wenn ich aber 2 Ebenen habe...
...komme eine Fehlermeldung ich solle den "thread_stack" erhöhen.
Ich frage mich, ob meine Funktion falsch ist, oder ob ich wirklich den "thread_stack" erhöhen muss?
Die gleiche Sache hatte ich hier mit SQL Server, da habe ich aber letztendlich eine UDF verwendet: https://www.datenbankforum.com/thre...men-und-per-varchar-max-output-ausgeben.2518/
Grüsse, Jan