MySQL创建递归阶乘函数报错误码1424问题咨询
报错原因排查
- 缺少递归终止边界判断:现有代码未对入参n做合法校验和终止判断,调用后会无限触发
FactorialR(n-1)递归,即使开启递归权限也会最终栈溢出。 - MySQL默认禁用存储程序递归:MySQL系统变量
max_sp_recursion_depth默认值为0,禁止所有存储函数、存储过程的递归调用,直接触发1424错误。
可行实现方案
方案1:递归实现(需开启递归权限)
- 先执行命令开启递归支持,数值可根据阶乘计算需求调整,不建议设置过大避免内存溢出:
SET max_sp_recursion_depth = 100;
- 改写函数增加边界判断,完整代码如下:
DELIMITER // CREATE FUNCTION FactorialR (n INT) RETURNS BIGINT BEGIN -- 负数无合法阶乘返回NULL IF n < 0 THEN RETURN NULL; END IF; -- 递归终止条件:0!和1!均为1 IF n <= 1 THEN RETURN 1; END IF; RETURN FactorialR(n-1) * n; END// DELIMITER ;
注意:INT类型最大仅支持到12!的计算,返回值改为BIGINT可支持到20!,超过该范围建议改用DECIMAL类型存储。
方案2:迭代实现(无需修改系统配置,稳定性更高)
不需要开启递归权限,也没有递归深度限制,适合生产环境使用:
DELIMITER // CREATE FUNCTION FactorialI (n INT) RETURNS BIGINT BEGIN DECLARE resultado BIGINT DEFAULT 1; IF n < 0 THEN RETURN NULL; END IF; WHILE n > 1 DO SET resultado = resultado * n; SET n = n - 1; END WHILE; RETURN resultado; END// DELIMITER ;
内容的提问来源于stack exchange,提问作者Zidane Ortiz Diaz
相关产品推荐
相关产品推荐

