Здравствуйте!
Есть такая задача: надо в функции просмотреть некоторую совокупность строк из таблицы, обработать их и возвратить результат. Для примера я написал сильно упрощенную функцию, но она не работает: возвращаемое значение всегда 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
Может, книга устарела, или что... не знаю, но вроде по примеру из книги делал
Но я нашел другой вариант
Но я нашел другой вариант цикла (работает как надо):
Не понятно зачем в цикле
Не понятно зачем в цикле делать проверку, если можно использоватье CASE