Возвращение набора записей с GROUP данными

BinaryBoy
Дата: 15.09.2004 13:58:19
В добровольно-принудительном порядке был вынужден переезжать на СУБД PostgreSQL так что некоторых тонкостей пока еще не уловил. А вопрос следующий:

Есть функция, возвращающая SETOF record. Внутри я возвращаю записи следующим образом

for result in select DID, count(*) as VCount from visits
group by DID loop
return next result;
end loop;

При попытке извлечь данные из функции ругается:
"Wrong record type supplied in RETURN NEXT"

Если убираю группировку - все прекрасно работает. Кто-нить поделитесь соображениями, чего не так делаю?
vadimm
Дата: 15.09.2004 21:55:59
Попробуй так:
CREATE TYPE typ1 AS (DID int, VCount int);

CREATE OR REPLACE FUNCTION public.f1()
  RETURNS SETOF typ1 AS
'
DECLARE
	sql TEXT;
        ret typ1%ROWTYPE;
BEGIN
	sql := \'select DID, count(*) as VCount from visits group by DID\';
	FOR ret IN EXECUTE sql LOOP
		RETURN NEXT ret;
	END LOOP;
	RETURN;
END
'
  LANGUAGE 'plpgsql' VOLATILE;
BinaryBoy
Дата: 16.09.2004 10:07:20
Спасибо, я уже нашел в чем проблема.
Вся фишка в том, что я хочу обойтись без создания дополнительных типов.

Все просто, при использовании агрегатных функций, возвращаемый тип данных у которых не определен (т.е. все кроме min и max) нужно явно приводить полученное поле к одному из типов:

for result in select DID, (cast(count(*) as int4)) as VCount from visits
group by DID loop
return next result;
end loop;