Ik weet dat je specifiek hebt gevraagd hoe je dit zonder . kunt doen een door de gebruiker gemaakte variabele - maar voor anderen die deze gedachte tegenkomen, zou het de moeite waard zijn om te posten hoe je dit met doet een omdat het vrij eenvoudig is:
CREATE PROCEDURE sp_recursive
BEGIN
// ... DECLAREs here
-- Set maximum recursion depth (max is 255)
SET @@SESSION.max_sp_recursion_depth = 10;
-- Increment current recursion depth
SET @recursion_depth = IFNULL(@recursion_depth + 1, 1);
-- ... More stored procedure code
-- Decrement current recursion depth. Note: Care must be taken to ensure this line
-- is *always* executed at the end of the stored procedure.
SET @recursion_depth = @recursion_depth - 1;
END
Uitleg
De @recursion_depth
sessie-scoped variabele wordt verhoogd met de bovenstaande SET
elke keer dat de opgeslagen procedure wordt ingevoerd. De eerste keer dat het wordt ingevoerd, is de variabele niet geïnitialiseerd en heeft dus de waarde NULL
- dit wordt gecontroleerd door de IFNULL()
, die het in dit geval opnieuw toewijst aan één. Aan het einde van de opgeslagen procedure, net voor het verlaten, moet de diepte worden verlaagd.
Verdere opmerkingen
Vermeldenswaard dat SQL Server doet zorgen voor een ingebouwde @@NESTLEVEL
variabele om het bovenstaande te doen - maar helaas lijkt MySQL geen equivalent te hebben.