使用PL / SQL,可以从同一个函数中调用存储的函数。这可以通过以下示例演示:
CREATE OR REPLACE FUNCTION factorial(x in number)
RETURN number
IS
f number;
BEGIN
IF x = 0 THEN
f := 1;
ELSE
f := x * factorial(x-1);
END IF;
RETURN f;
END;
/
DECLARE
num number;
factorial number;
BEGIN
num := #
factorial := factorial(num);
dbms_output.put_line(' The factorial of '|| num || ' is ' || factorial);
END;
/
这可以使用PL / SQL存储过程完成吗?
答案 0 :(得分:2)
你当然可以递归地调用PL / SQL函数(包含所有常用的警告,说明在任何语言中这样做的危险!)。
如果您将局部变量命名为与函数相同,则会遇到麻烦。例如,当您尝试执行块时,您将收到此错误:
PLS-00222: no function with name 'FACTORIAL' exists in this scope
答案 1 :(得分:2)
是的,您可以编写一个在PL / SQL中递归调用自身的过程。这是一个例子 - 实现阶乘。
话虽如此,不要在没有错误处理的情况下编写程序(或像你这样的函数)。如果您不明白原因,请在下面的匿名屏蔽中将5
更改为5.3
,然后您就会知道原因。
代码窗口:
create or replace procedure fact ( x in number, x_fact out number )
as
begin
if x = 0 then x_fact := 1;
else fact(x-1, x_fact);
x_fact := x * x_fact;
end if;
end;
/
set serveroutput on
declare
z number;
begin
fact(5, z);
dbms_output.put_line(z);
end;
/
SCRIPT OUTPUT窗口(将每个"结果"匹配到作为练习留下的代码的相应部分):
Procedure FACT compiled
PL/SQL procedure successfully completed.
120