递归存储过程

时间:2015-05-26 15:51:38

标签: sql stored-procedures recursion db2

我发现此代码已被剪切(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的递归存储过程的最小运行示例。

2 个答案:

答案 0 :(得分:1)

以下代码来自DB2的SQL技巧,由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

答案 1 :(得分:1)

这对我有用:(我还没有做更多工作,所以替代编码也可以。)

首先,添加以下两行:

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上运行。