我有一个递归的mysql存储过程,我已经为它设置了max_sp_recursion_depth=10.
现在,在不设置局部变量的情况下,我想知道单次执行期间递归的级别是多少。
我认为肯定有一个存储深度的会话变量(当您达到最大级别时,您怎么知道),但我找不到它。我会避免使用变量来增量执行此操作。我怎么知道这个(如果有的话)系统变量?
我知道您特别询问如何在没有用户创建的变量的情况下执行此操作 - 但对于遇到此变量的其他人来说,值得发布如何使用一个变量执行此操作,因为它相当简单:
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似乎没有等效项。