Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir de la profondeur dans la récursivité de la procédure de magasin mysql?

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.