递归存储过程

Recursive Stored Procedures

我发现这段代码被剪掉了 (Source):

CREATE PROCEDURE rec_fib(n INT, OUT out_fib INT)
BEGIN
  DECLARE n_1 INT;
  DECLARE n_2 INT;

  IF (n=0) THEN
    SET out_fib=0;
  ELSEIF (n=1) then
    SET out_fib=1;
  ELSE
    CALL rec_fib(n-1,n_1);
    CALL rec_fib(n-2,n_2);
    SET out_fib=(n_1 + n_2);
  END IF;
END

此代码适用于 MySQL。我必须在 DB2 上将它修改到 运行 多远?我似乎找不到 运行DB2 递归存储过程的最小示例。

以下代码来自 SQL DB2 技巧,由 Serge Rielau

编写
CREATE OR REPLACE FUNCTION Fib(n INTEGER) RETURNS DECIMAL(31, 0)
BEGIN
      DECLARE res DECIMAL(31, 0);
  CASE WHEN n = 0 THEN
             SET res = 0;
       WHEN n = 1 THEN
         SET res = 1;
       WHEN n > 1 THEN
         BEGIN
           DECLARE stmt STATEMENT;
           PREPARE stmt FROM 'SET ? = Fib(? - 1) + Fib(? - 2)';
           EXECUTE stmt INTO res USING n, n;
     END;
       ELSE
         SIGNAL SQLSTATE '78000' SET MESSAGE_TEXT = 'Bad input';
  END CASE;
  RETURN res;
END;
/

更多信息,请查看此代码的源页面:https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/recursive_sql_pl?lang=en

这对我有用:(我只是让它起作用,所以替代编码也可以起作用。)

首先,添加这两行:

DECLARE n_3 INT;
DECLARE n_4 INT;

然后修改这个小节:

ELSE
   set n_3 = n - 1;
   set n_4 = n - 2;
   CALL rec_fib(n_3,n_1);
   CALL rec_fib(n_4,n_2);

就是这样。在 IBM i 6.1 DB2 UDB 上运行。