Listado completo de tutoriales

108 - Procedimientos almacenados (llamadas recursivas)


Ver video

En MySQL podemos codificar procedimientos almacenados que se llamen en forma recursiva como ocurre en otros lenguajes de programación.

Es una característica que hay que usar con cuidado ya que puede afectar la eficiencia de nuestros algoritmos. Por defecto MySQL tiene desactiva la posibilidad de hacer llamadas recursivas.

Para activar la posibilidad de hacer llamadas recursivas debemos modificar la variable del sistema 'max_sp_recursion_depth' indicando la cantidad de llamadas recursivas posibles:

SET @@session.max_sp_recursion_depth = 10; 

Problema

Implementar un procedimiento almacenado que calcule el factorial de un número haciendo llamadas recursivas en su algoritmo:

SET @@session.max_sp_recursion_depth = 10; 

drop procedure if exists pa_factorial;

delimiter //
create procedure pa_factorial(
  in valor int,
  out resu int)
begin
  if valor=0 then
    set resu=1;
  else
    call pa_factorial(valor-1,resu);
    set resu=valor*resu;
  end if;
end //  
delimiter ;

call pa_factorial(5,@resu);
select @resu;

Como podemos ver dentro del procedimiento almacenado 'pa_factorial' hacemos la llamada recursiva:

    call pa_factorial(valor-1,resu);

Es importante notar que hemos activado las llamadas recursivas hasta 10 para la sesión activa:

SET @@session.max_sp_recursion_depth = 10; 

Cuando se cierra la sesión con MySQL se desactiva la posibilidad de hacer llamadas recursivas hasta que se vuelva a modificar la variable del sistema 'max_sp_recursion_depth'.

Si queremos activar las llamadas recursivas a nivel global del gestor de base de datos MySQL debemos hacerlo con la siguiente sintaxis:

SET @@GLOBAL.max_sp_recursion_depth = 5;

El valor máximo que podemos almacenar en la variable del sistema 'max_sp_recursion_depth' es 255.

Retornar