首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL不支持递归函数?为什么?什么时候开始的?

问MySQL不支持递归函数?为什么?什么时候开始的?
EN

Stack Overflow用户
提问于 2010-08-21 05:58:04
回答 3查看 9.2K关注 0票数 6

我编写了一个递归调用自己的存储函数。

然而,当我在查询中运行它时,我会得到这个无耻的错误:

错误: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION) 消息:递归存储函数和触发器是,不允许。

“不允许”?

正确的。我们为什么不同时禁用we循环呢?

我可以以任何方式启用递归函数吗?

我找到了一个错误报告,但是有什么解决办法吗?

我正在Windows (XAMPP )上运行MySQL 5.1.41。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-29 09:05:09

没问题Jenco。效率不如PostgreSQL函数,但在MySQL过程中也可以:

代码语言:javascript
复制
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 |
+--------------+

谢尔盖·扎伊采夫。

票数 3
EN

Stack Overflow用户

发布于 2010-08-21 06:02:26

MySQL 5.1支持递归存储过程,但不支持递归函数。引用文档

存储的函数不能是递归的。 存储过程中的递归是允许的,但默认情况下禁用。若要启用递归,请将max_sp_recursion_depth服务器系统变量设置为大于零的值。存储过程递归增加了对线程堆栈空间的要求。如果您增加了max_sp_recursion_depth的值,则可能需要在服务器启动时通过增加thread_stack的值来增加线程堆栈的大小。

票数 4
EN

Stack Overflow用户

发布于 2010-08-21 07:34:47

可能是因为MySQL需要限制其线程的堆栈大小而不鼓励在存储例程中递归。

MySQL通常每个连接使用一个线程。10秒或1000秒的连接是常见的。

在32位平台上,当运行1000个线程时,地址空间压力很大,因此需要设置非常小的堆栈,以避免地址空间耗尽。

当然,堆栈溢出非常糟糕--无法安全地从其中恢复。所以我认为MySQL这样做是为了防止堆栈溢出,特别是在32位平台上。

尽管如此,现在任何在生产MySQL服务器上使用32位操作系统的人都是疯狂的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3536538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档