【问题标题】:Print sum of n numbers in plsql在plsql中打印n个数字的总和
【发布时间】:2019-04-21 05:15:40
【问题描述】:
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 个数字的总和,但出现以下错误:
警告:函数创建时出现编译错误。
【问题讨论】:
标签:
plsql
sum
plsqldeveloper
【解决方案1】:
两件事:
- 严格来说,数字不一定是整数,所以最好使用 pls_integer 或至少检查代码中传入的参数是整数
- 如果问题是问如何返回前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;
【解决方案2】:
您的代码中几乎没有错误。
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
【解决方案3】:
下面的代码sn -p就是解决办法:
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;
/