温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

存储过程能递归调用吗

发布时间:2026-09-23 17:49:50 来源:亿速云 阅读:81 作者:小樊 栏目:数据库

可以,存储过程是可以递归调用的。

不过具体是否支持、怎么用、有什么限制,取决于你使用的数据库类型。


一、主流数据库对递归存储过程的支持

数据库 是否支持递归存储过程 说明
Oracle ✅ 支持 直接递归调用自身即可
MySQL ✅ 支持(5.0+) 需要设置 max_sp_recursion_depth
SQL Server ✅ 支持 有最大递归层数限制(默认 32)
PostgreSQL ✅ 支持 函数/存储过程均可递归
DB2 ✅ 支持 有递归深度限制

二、示例

1️⃣ MySQL 递归存储过程示例

SET max_sp_recursion_depth = 10;

DELIMITER $$
CREATE PROCEDURE test_recursive(IN n INT)
BEGIN
  IF n > 0 THEN
    SELECT n;
    CALL test_recursive(n - 1);
  END IF;
END$$
DELIMITER ;

CALL test_recursive(5);

2️⃣ Oracle 示例

CREATE OR REPLACE PROCEDURE p_rec(n NUMBER) IS
BEGIN
  IF n > 0 THEN
    DBMS_OUTPUT.PUT_LINE(n);
    p_rec(n - 1);
  END IF;
END;

三、注意事项(非常重要)

  1. 递归深度限制

    • 超过限制会报错
    • 如 SQL Server:maximum stored procedure recursion depth exceeded
  2. 必须有终止条件

    • 否则会无限递归,直接搞挂数据库
  3. 性能问题

    • 递归存储过程一般不如:
      • 递归 CTE(公用表表达式)
      • 循环(WHILE / LOOP)
  4. 事务与锁

    • 递归中可能持有锁,容易死锁或阻塞

四、什么时候不建议用递归存储过程?

  • 树形结构查询(优先用 递归 CTE
  • 大数据量处理
  • 对性能要求高的场景

如果你能告诉我 用的是哪种数据库 + 具体业务场景,我可以直接帮你写更合适的方案(递归 or 非递归)。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI