Wiem, że spytałeś, jak to zrobić bez zmienną utworzoną przez użytkownika — ale dla innych, którzy natkną się na tę myśl, warto opublikować, jak to zrobić za pomocą jeden, ponieważ jest dość prosty:
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
Wyjaśnienie
@recursion_depth
Zmienna o zasięgu sesji jest zwiększana przez powyższy SET
oświadczenie za każdym razem, gdy wprowadzana jest procedura składowana. Przy pierwszym wprowadzeniu zmienna jest niezainicjowana i ma wartość NULL
- jest to sprawdzane przez IFNULL()
, który w tym przypadku ponownie przypisuje go do jednego. Pod koniec procedury składowanej, tuż przed wyjściem, głębokość należy zmniejszyć.
Dalsze uwagi
Warto zauważyć, że SQL Server robi zapewnij wbudowany @@NESTLEVEL
zmienna służąca do wykonania powyższego - ale niestety MySQL nie ma odpowiednika.