3

我有一个递归mysql 存储过程,我已经为其设置了max_sp_recursion_depth=10.

现在,在不设置局部变量的情况下,我想知道单次执行期间递归的级别是多少。

我认为肯定有一个会话变量存储深度(当你达到最大水平时你怎么知道)但我找不到它。我会避免使用变量来逐步执行此操作。我怎么知道这个(如果有的话)系统变量?

4

1 回答 1

2

我知道您特别问过如何在没有用户创建变量的情况下执行此操作 - 但对于其他遇到此想法的人来说,值得发布如何使用一个变量来执行此操作,因为它相当简单:

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 似乎没有等效的变量。

于 2018-02-06T16:18:52.137 回答