递归子程序
递归子程序调用它自己。递归是简化算法的强有力的技术。
一个递归子程序必须有至少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; |
--返回第n个Fabonacii数 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 FOR和CLOSE语句之间的递归调用,在每次调用时都会打开另一个光标,这可能会引起打开的光标数超过数据库初始化参数OPEN_CURSORS设置的上限。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1132829/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1132829/