pl/sql中的数字的阶乘

rip*_*ppy 1 oracle plsql syntax-error

以下pl/sql程序在行上执行生成错误sum:= temp*sum; 遇到符号; 期待时(.请解释我的错误.

declare
  n number;
  temp number;
  sum number := 1;
begin
  n := &n;
  temp := n;
  while temp>0 loop
    sum := temp*sum;
    temp := temp-1;
  end loop;
  dbms_output.put_line('Factorial of '||n||' is '||sum);
end;
/
Run Code Online (Sandbox Code Playgroud)

smn*_*brv 5

也许不是你问题的答案,但这里不需要PL/SQL:

select round(exp(sum(ln(level))))
from dual
connect by level <= 5;
Run Code Online (Sandbox Code Playgroud)

其中5是你的号码(5!).

另外,如果你想在PL/SQL使用中更快地操作pls_integer而不是number.

UPDATE

所以根据评论我可以随意测试:

create or replace package test_ is

  function by_query(num number) return number deterministic;

  function by_plsql(num number) return number deterministic;

end test_;

/

create or replace package body test_ is

  function by_query(num number) return number deterministic
    is
      res    number;
  begin
    select round(exp(sum(ln(level))))
    into res
    from dual
    connect by level <= num;

    return res;
  end;

  function by_plsql(num number) return number deterministic
    is
      n number := 0;
  begin
    for i in 1..num loop
      n := n + ln(i);
    end loop;

    return round(exp(n));
  end;

end test_;
Run Code Online (Sandbox Code Playgroud)

所以有两个不同内容的功能.测试查询:

declare
  dummy   number;
begin
  for i in 1..10000 loop
    dummy := test_.by_query(5);
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

0.094秒

declare
  dummy   number;
begin
  for i in 1..10000 loop
    dummy := test_.by_plsql(5);
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

0.094秒

你会说我是骗子并使用deterministic关键字,但这里显而易见并且需要逻辑.如果我删除它,相同的脚本工作1.7秒对1.3秒,所以程序只是更快一点,性能甚至没有双赢.如果在查询中使用该函数,则会产生完全相反的效果,因此这是一种公平交易.