我编写了一个递归调用自己的存储函数。
然而,当我在查询中运行它时,我会得到这个无耻的错误:
错误: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION) 消息:递归存储函数和触发器是,不允许。
“不允许”?
正确的。我们为什么不同时禁用we循环呢?
我可以以任何方式启用递归函数吗?
我找到了一个错误报告,但是有什么解决办法吗?
我正在Windows (XAMPP )上运行MySQL 5.1.41。
发布于 2010-10-29 09:05:09
没问题Jenco。效率不如PostgreSQL函数,但在MySQL过程中也可以:
DELIMITER $$
DROP PROCEDURE IF EXISTS test.factorial_proc$$
CREATE PROCEDURE test.factorial_proc
(
IN n BIGINT,
OUT res BIGINT
)
BEGIN
SET max_sp_recursion_depth=10;
IF n >= 2 THEN
CALL test.factorial_proc (n-1, res);
SELECT n * res INTO res;
ELSE
SELECT n INTO res;
END IF;
END$$
DELIMITER ;
[test]> CALL test.factorial_proc (5, @res);
[test]> CALL test.factorial_proc (5, @res1);
[test]> select @res * @res1;
+--------------+
| @res * @res1 |
+--------------+
| 14400 |
+--------------+谢尔盖·扎伊采夫。
发布于 2010-08-21 06:02:26
MySQL 5.1支持递归存储过程,但不支持递归函数。引用文档
存储的函数不能是递归的。 存储过程中的递归是允许的,但默认情况下禁用。若要启用递归,请将
max_sp_recursion_depth服务器系统变量设置为大于零的值。存储过程递归增加了对线程堆栈空间的要求。如果您增加了max_sp_recursion_depth的值,则可能需要在服务器启动时通过增加thread_stack的值来增加线程堆栈的大小。
发布于 2010-08-21 07:34:47
可能是因为MySQL需要限制其线程的堆栈大小而不鼓励在存储例程中递归。
MySQL通常每个连接使用一个线程。10秒或1000秒的连接是常见的。
在32位平台上,当运行1000个线程时,地址空间压力很大,因此需要设置非常小的堆栈,以避免地址空间耗尽。
当然,堆栈溢出非常糟糕--无法安全地从其中恢复。所以我认为MySQL这样做是为了防止堆栈溢出,特别是在32位平台上。
尽管如此,现在任何在生产MySQL服务器上使用32位操作系统的人都是疯狂的。
https://stackoverflow.com/questions/3536538
复制相似问题