【问题标题】:Recursive Stored Procedures递归存储过程
【发布时间】:2015-08-08 09:48:55
【问题描述】:

我发现这段代码被剪断了 (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 stored-procedures recursion db2


    【解决方案1】:

    以下代码来自 Serge Rielau 编写的 DB2 SQL 技巧

    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

    【讨论】:

      【解决方案2】:

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

      首先,添加这两行:

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

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 2013-11-13
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多