我有一个递归mysql 存储过程,我已经为其设置了max_sp_recursion_depth=10.
现在,在不设置局部变量的情况下,我想知道单次执行期间递归的级别是多少。
我认为肯定有一个会话变量存储深度(当你达到最大水平时你怎么知道)但我找不到它。我会避免使用变量来逐步执行此操作。我怎么知道这个(如果有的话)系统变量?
我有一个递归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 似乎没有等效的变量。