sql >> Database >  >> RDS >> Mysql

Hoe diepgang te krijgen in recursie van mysql-winkelprocedures?

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.




  1. Hoe to_timestamp() werkt in PostgreSQL

  2. Geheugenlek in JDBC4Connection

  3. MySQL GROUP door of met PHP?

  4. Voeg elke maand waarde toe aan een kolom in de Mysql-database