Je sais que vous avez spécifiquement demandé comment faire cela sans une variable créée par l'utilisateur - mais pour d'autres qui rencontrent cette idée, il vaudrait la peine de publier comment le faire avec un car c'est assez simple :
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
Explication
Le @recursion_depth
la variable de portée de session est incrémentée par le SET
ci-dessus instruction chaque fois que la procédure stockée est entrée. La première fois qu'elle est saisie, la variable n'est pas initialisée et a donc la valeur NULL
- ceci est vérifié par le IFNULL()
, qui le réaffecte à un dans ce cas. A la fin de la procédure stockée juste avant de sortir, la profondeur doit être décrémentée.
Remarques supplémentaires
À noter que SQL Server fait fournir un @@NESTLEVEL
intégré variable pour faire ce qui précède - mais malheureusement MySQL ne semble pas avoir d'équivalent.