sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo obtener profundidad en la recursividad del procedimiento de almacenamiento mysql?

Sé que preguntaste específicamente cómo hacer esto sin una variable creada por el usuario, pero para otros que se encuentren con esto, valdría la pena publicar cómo hacerlo con uno ya que es bastante simple:

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

Explicación

El @recursion_depth la variable de ámbito de sesión se incrementa por el SET anterior instrucción cada vez que se ingresa al procedimiento almacenado. La primera vez que se ingresa, la variable no se inicializa y, por lo tanto, tiene un valor de NULL - esto lo verifica el IFNULL() , que lo reasigna a uno en este caso. Al final del procedimiento almacenado, justo antes de salir, es necesario disminuir la profundidad.

Más notas

Vale la pena señalar que SQL Server lo hace proporcionar un @@NESTLEVEL incorporado variable para hacer lo anterior, pero desafortunadamente MySQL no parece tener un equivalente.