在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;
/
两件事:
- number 严格来说不一定是整数,所以最好使用 pls_integer 或者至少在代码中检查传入的参数是整数
- 如果问题是问如何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;
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;
/
两件事:
- number 严格来说不一定是整数,所以最好使用 pls_integer 或者至少在代码中检查传入的参数是整数
- 如果问题是问如何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;