PL / SQL程序可以递归调用自己吗?

问题描述 投票:-2回答:2

使用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存储过程完成吗?

oracle stored-procedures plsql
2个回答
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

2
投票

你当然可以递归地调用PL / SQL函数(所有常见的警告都是关于使用任何语言这样做的危险!)。

但是,如果将局部变量命名为与函数相同,则会遇到麻烦。例如,当您尝试执行块时,您将收到此错误:

PLS-00222: no function with name 'FACTORIAL' exists in this scope
© www.soinside.com 2019 - 2024. All rights reserved.