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.