ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Reference-PL/SQL子程序-递归子程序

PLSQL Language Reference-PL/SQL子程序-递归子程序

原创 Oracle 作者:LuiseDalian 时间:2014-03-30 21:22:16 0 删除 编辑

递归子程序

递归子程序调用它自己。递归是简化算法的强有力的技术。

一个递归子程序必须有至少2条执行路径:一个走向递归调用,一个走向终止条件。如果没有后者递归会持续,直到PL/SQL耗尽内存并引发STORAGE_ERROR异常。

--计算n的阶乘

CREATE OR REPLACE FUNCTION factorial (n POSITIVE) RETURN POSITIVE

IS

BEGIN

    IF n = 1 THEN                 -- 终止条件

        RETURN n;

    ELSE

        RETURN n * factorial(n-1);  -- 递归调用

    END IF;

END;

/

BEGIN

    FOR i IN 1..5 LOOP

        DBMS_OUTPUT.PUT_LINE(i || '! = ' || factorial(i));

    END LOOP;

END;

 

--返回第nFabonacii

CREATE OR REPLACE FUNCTION fibonacci (n PLS_INTEGER) RETURN PLS_INTEGER

IS

    fib_1 PLS_INTEGER := 0;

    fib_2 PLS_INTEGER := 1;

BEGIN

    IF n = 1 THEN                              -- 终止条件

        RETURN fib_1;

    ELSIF n = 2 THEN

        RETURN fib_2;                           -- 终止条件

    ELSE

        RETURN fibonacci(n-2) + fibonacci(n-1);  -- 递归调用

    END IF;

END;

/

BEGIN

    FOR i IN 1..10 LOOP

        DBMS_OUTPUT.PUT(fibonacci(i));

        IF i < 10 THEN

            DBMS_OUTPUT.PUT(', ');

        END IF;

    END LOOP;

 

    DBMS_OUTPUT.PUT_LINE(' ...');

END;

 

对子程序的每次递归调用,都会产生子程序声明的每个成员和子程序的执行的每条语句的新的实例。

在光标FOR循环、或在OPEN/OPEN FORCLOSE语句之间的递归调用,在每次调用时都会打开另一个光标,这可能会引起打开的光标数超过数据库初始化参数OPEN_CURSORS设置的上限。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1132829/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5566253