sql >> Databáze >  >> RDS >> Mysql

Jak získat hloubku v rekurzi procedury úložiště mysql?

Vím, že jste se konkrétně zeptali, jak to udělat bez uživatelsky vytvořená proměnná – ale pro ostatní, kteří se setkají s touto myšlenkou, by stálo za to napsat, jak to udělat pomocí jeden, protože je docela jednoduchý:

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

Vysvětlení

@recursion_depth proměnná v rozsahu relace je zvýšena o výše uvedený SET při každém zadání uložené procedury. Při prvním zadání je proměnná neinicializovaná a má tedy hodnotu NULL - toto je kontrolováno pomocí IFNULL() , která jej v tomto případě přeřadí na jedničku. Na konci uložené procedury těsně před ukončením je třeba hloubku snížit.

Další poznámky

Stojí za zmínku, že SQL Server dělá poskytnout vestavěný @@NESTLEVEL proměnná pro výše uvedené - ale bohužel se zdá, že MySQL nemá ekvivalent.




  1. Jak zjistím, zda tabulka mysql používá myISAM nebo InnoDB Engine?

  2. Jak volat uloženou proceduru v Entity Framework Core se vstupními a výstupními parametry pomocí mysql

  3. Použití vláken k vytváření požadavků na databázi

  4. Jak vytvořit databázově řízenou víceúrovňovou navigační nabídku pomocí Laravelu