#plsql #sum #plsqldeveloper
#plsql #сумма #plsqldeveloper
Вопрос:
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 чисел, но получаю следующую ошибку:
Предупреждение: функция создана с ошибками компиляции.
Ответ №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:
Следующий фрагмент кода является решением:
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;
/