CREATE PROCEDURE `pr_factorial`(
IN `valor` INT,
OUT `resultado` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
if (valor = 0) then
SET resultado = 1;
ELSE
CALL pr_factorial(valor-1, resultado);
SET resultado = valor*resultado;
END if;
END;
Ejemplo llamada:
call pr_factorial(5,@resu);
select @resu;
No se permiten funciones recursivas, para convertir factorial en función se podría hacer de la siguiente manera:
CREATE FUNCTION `fn_factorial`(
`valor` INT
)
RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE mivar int;
CALL pr_factorial(valor,mivar);
RETURN mivar;
/* no está permitida la recursividad en funciones
IF valor = 0 then
RETURN 1;
ELSE
RETURN valor * fn_factorial(valor-1);
END IF;
*/
END
Ejemplo de llamada sería:
SET @@session.max_sp_recursion_depth = 255;
call pr_factorial(5,@resu);
select @resu, FN_FACTORIAL(5);