在plsql中打印n个数字的总和

Print sum of n numbers in plsql

CREATE OR REPLACE FUNCTION printsum(n IN number) IS
res number:=0;
BEGIN
while(n>0)
LOOP
res:=res+n;
n:=n-1;
EXIT WHEN n=0;
END LOOP;
dbms_output.put_line(' result of sum: '||res);
END;
/

我正在尝试打印 n 个数字的总和,但出现以下错误:

Warning: Function created with compilation errors.

您的代码中几乎没有错误。

1) Function 必须有一个 Return 但您的代码在开头和结尾缺少 Return 语句。

2) IN 参数不能在代码中重新赋值。所以需要将IN参数复制到变量中进行迭代。

试试这个:

CREATE OR REPLACE FUNCTION printsum( n IN NUMBER)
    RETURN NUMBER
  IS
    res   NUMBER:=0;
    v_num NUMBER:=n;
  BEGIN        
    WHILE(v_num>0)
    LOOP
      res   := res   + v_num;
      v_num := v_num -1;
      EXIT  WHEN v_num=0;        
    END LOOP;

    dbms_output.put_line(' result of sum: '||res);

    RETURN(res);      
  END;
  / 

输出:

SQL> select printsum(10) from dual;

PRINTSUM(10)
------------
          55

下面的代码片段就是解决方案:

declare
  sm number;
  tmp number;
  n number;
  i number;
function sumn(n integer)
return number
is
sm number;
begin
   sm:=0;
tmp:=n;
for i in 1..tmp LOOP
    sm:=sm+i;
END LOOP;
return sm;
END;
begin
   n:=10;
   sm:=sumn(n);
    dbms_output.put_line('sum is',sm);
end;
/

两件事:

  1. number 严格来说不一定是整数,所以最好使用 pls_integer 或者至少在代码中检查传入的参数是整数
  2. 如果问题是问如何return前n个正整数之和,正确答案是使用封闭式公式:n * (n + 1)/2

使用公式可以得到常数时间的答案。

function printsum(n pls_integer) return n is
begin
  if(n < 0) then raise value_error; end if; -- or a more meaningful exception
  return (n * (n + 1) / 2);
end;