Вывести сумму из n чисел в plsql

#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:

Две вещи:

  1. число, строго говоря, не обязательно является целым, поэтому лучше всего использовать pls_integer или, по крайней мере, проверить в коде, что переданный аргумент является целым
  2. если вопрос заключается в том, как вернуть сумму первых 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;
/