Просмотр строк таблицы в функции

Здравствуйте!
Есть такая задача: надо в функции просмотреть некоторую совокупность строк из таблицы, обработать их и возвратить результат. Для примера я написал сильно упрощенную функцию, но она не работает: возвращаемое значение всегда null

CREATE OR REPLACE FUNCTION "finance"."bal" (m_id_ integer, dps_type_ integer, id_ integer) RETURNS double precision AS
$body$
DECLARE
  summv DOUBLE PRECISION;
  dps_row finance.deposites%ROWTYPE;
  res INTEGER;
BEGIN
  summv := 0;
  res := 1;
  FOR dps_row IN 
    SELECT id, summ FROM finance.deposites 
      WHERE m_id = m_id_ AND dps_type = dps_type_ AND id <> id_
    LOOP
    summv := summv + dps_row.summ;
  END LOOP;
  RETURN (summv);
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

В етом примере функция через переменную summv должна бы возвращать сумму нескольких строк из таблицы: но она всегда возвращает только значение null: dps_row.summ не содержит значения из таблиц.

Вызываю функцию, например так:
SELECT finance.bal(93, 9, -400)
В таблице гарантированно существуют строки по заданному условию.

Причем, если делать debug в среде SQL Manager 2007, то возвращаемое значение должно быть правильное, но результатом SELECTа всегда есть null: dps_row.summ не содержит значения из таблицы.

Что не так? Как правильно в PostgreSQL- функции организовать цикл по совокупности записей таблицы?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Что мне бросается в глаза,

Что мне бросается в глаза, что вы начинаете делать цикл
FOR dps_row IN...
на момент, когда у вас в dps_row нет никакого значения. Возникает вопрос - каким образом у вас должен выполняться цикл? Вы только задекларировали переменную, но никаких значений ей не присвоили.

Значения в тупеременную как

Значения в тупеременную как раз должны бы браться из SELECTа

С одной стороны да, но меня

С одной стороны да, но меня терзают сомнения, что можно брать значения двух полей и присваивать одной переменной, даже если она row. Возможно надо что-то ещё написать, чтобы SELECT вернул не два поля, а именно row? Надо доки изучать.

На счет цикла, то я взял

На счет цикла, то я взял пример из книги: Matthew N., Stones R. Beginning Databases with PostgreSQL, 2005

Может, книга устарела, или что... не знаю, но вроде по примеру из книги делал

Но я нашел другой вариант

Но я нашел другой вариант цикла (работает как надо):

DECLARE
  summv DOUBLE PRECISION;
  dti DATE;
  idi INTEGER;
  summi DOUBLE PRECISION;
BEGIN
  summv := 0;
  FOR dti, idi, summi IN 
    SELECT dt, id, summ FROM finance.deposites 
      WHERE m_id = m_id_ AND dps_type = dps_type_ AND id <> id_
    UNION
    SELECT dt_, id_, summ_
    ORDER BY 1, 2
  LOOP
    summv := summv + summi;
    IF summv < 0 THEN 
      RETURN 0;
    END IF;
  END LOOP; 
  RETURN 1;
END;

Не понятно зачем в цикле

Не понятно зачем в цикле делать проверку, если можно использоватье CASE

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023