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.