Postgresql - Базовый цикл - PullRequest
       18

Postgresql - Базовый цикл

0 голосов
/ 13 марта 2012

Необходимо написать функцию, которая возвращает сумму всех квадратов между двумя числами, введенными пользователем.Вот что я написал, но не могу заставить его работать.Например, sumAll (2, 5) должен дать результат 54.

CREATE OR REPLACE FUNCTION SumAll(integer,integer) RETURNS integer as $$
DECLARE
    num1 ALIAS for $1;
    num2 ALIAS for $2;
    ret_sum integer;
    sum1 integer;
BEGIN

    for i in num1..num2 LOOP
        sum1:=i*i;
        ret_sum=ret_sum+sum1;
    END LOOP;
    return ret_sum;
END
$$ language 'plpgsql';

это не работает.что я делаю не так?

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Написание процедуры для перебора чисел предполагает, что вы не знаете, как подходить к работе с наборами данных в SQL.Такие вещи, как суммирование набора чисел, не должны требовать написания цикла вручную (и запись этого в plpgsql не играет на полную силу).

Вы можете создать набор чисел в диапазоне, используя вспомогательную функциюgenerate_series и возведите их в квадрат, чтобы получить все значения для суммирования:

steve@steve@[local] =# SELECT x, x*x FROM generate_series(2, 5) x;
 x | ?column? 
---+----------
 2 |        4
 3 |        9
 4 |       16
 5 |       25
(4 rows)

Затем просто используйте агрегатную функцию SUM():

steve@steve@[local] =# SELECT sum(x*x) FROM generate_series(2, 5) x;
 sum 
-----
  54
(1 row)
1 голос
/ 13 марта 2012

@ pukipuki указал на вашу ошибку. Я бы вообще упростил синтаксис, хотя:

CREATE OR REPLACE FUNCTION sumall(_num1 int, _num2 int, OUT ret_sum int)
  RETURNS int AS
$BODY$
BEGIN
    ret_sum := 0;

    FOR i IN _num1 .. _num2 LOOP
      ret_sum := ret_sum + i*i;
    END LOOP;
END
$BODY$ LANGUAGE plpgsql;
1 голос
/ 13 марта 2012

Вы забыли инициализировать одну переменную, добавьте ret_sum:=0; перед циклом for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...