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

时间:2017-12-18 19:48:15

标签: oracle stored-procedures plsql

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

2 个答案:

答案 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