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

递归子程序

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

一个递归子程序必须有至少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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1132829/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值