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