Знам, че конкретно попитахте как да направите това без променлива, създадена от потребителя - но за други, които попаднат на тази мисъл, би си струвало да публикуват как да го направят с едно, тъй като е доста просто:
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
Обяснение
@recursion_depth
Променливата с обхват на сесията се увеличава с горния SET
изявление всеки път, когато се въвежда съхранената процедура. Първият път, когато се въведе, променливата е неинициализирана и така има стойност NULL
- това се проверява от IFNULL()
, което го пренасочва към един в този случай. В края на съхранената процедура точно преди излизане, дълбочината трябва да бъде намалена.
Допълнителни бележки
Струва си да се отбележи, че SQL Server прави осигурете вграден @@NESTLEVEL
променлива за извършване на горното - но за съжаление MySQL изглежда няма еквивалент.