Jag vet att du specifikt frågade hur man gör detta utan en användarskapad variabel - men för andra som stöter på detta skulle det vara värt att publicera hur man gör det med en eftersom det är ganska enkelt:
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
Förklaring
@recursion_depth
sessionsomfattande variabel ökas med ovanstående SET
uttalande varje gång den lagrade proceduren skrivs in. Första gången den skrivs in är variabeln oinitierad och har därför värdet NULL
- detta kontrolleras av IFNULL()
, som omtilldelar den till en i det här fallet. I slutet av den lagrade proceduren precis innan du avslutar, måste djupet minskas.
Fler anmärkningar
Värt att notera att SQL Server gör tillhandahålla en inbyggd @@NESTLEVEL
variabel för att göra ovanstående - men tyvärr verkar MySQL inte ha en motsvarighet.