вернуть множество строк из функции

Добрый день.
Подскажите пожалуйста как написать функцию возвращаю множество столбцов и строк (таблицу) на plpgsql.
На SQL все отлично

CREATE OR REPLACE FUNCTION rating_point_list_default(IN p_userid integer, IN p_idel integer)
  RETURNS TABLE(id integer, title character varying, mark smallint) AS
$BODY$
SELECT service.id,service.title,mark  
FROM servicecategory,service LEFT OUTER JOIN rating ON (service.id = rating.serviceid AND rating.userid=$1 AND rating.pointid=$2) 
WHERE category IN('vid') AND servicecategory.id=service.categoryid;

а как тоже самое написать на plpgsql. Два дня уже сижу....
Спасибо
PS.
Версия postgresql 8.4.4

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

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

http://postgresql.ru.net/docs

Написал, собралась, но при

Написал, собралась, но при вызове выдает ошибку :
ERROR: a column definition list is required for functions returning "record"
LINE 1: select * from rating_point_list_(195,80);
^

********** Ошибка **********

ERROR: a column definition list is required for functions returning "record"
SQL state: 42601
Характеристика:15

SELECT * FROM rating_point_list_(195,80);

CREATE OR REPLACE FUNCTION rating_point_list_(IN p_userid integer, IN p_idel integer)
 returns setof record AS
$BODY$
DECLARE
 r record;
BEGIN
 
 FOR r IN EXECUTE '(SELECT id,title,category,mark 
	FROM servicecategory LEFT OUTER JOIN rating ON (servicecategory.id = rating.servicecategoryid and rating.userid='||p_userid||' and rating.pointid='||p_idel||') 
	WHERE category IN(''children'',''food'',''locate'',''price_c'',''relax'',''ser'') 
	)'
LOOP
	RETURN next r;
 
END LOOP;
RETURN;
 
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;

PS:
Крайте не хочеться создавать доп. типы. Хотелось бы использовать RETURNS TABLE , но не могу найти как.

Думаю, что предложенную

Думаю, что предложенную функцию лучше оформить приблизительно так:

CREATE OR REPLACE FUNCTION rating_point_list_(IN p_userid integer, IN p_idel integer, 
out oid servicecategory.id%TYPE, -- К примеру т.к. в запросе нет ссылок на таблицу
out otitle servicecategory.title%TYPE,
out ocategory servicecategory.category%TYPE,
out omark servicecategory.mark%TYPE)
 returns setof record AS
$BODY$
DECLARE
 r record;
BEGIN
 
 FOR oid, otitle, ocategory, omark IN SELECT s.id, s.title, s.category, s.mark 
                                                             FROM servicecategory s LEFT OUTER JOIN rating r ON s.id = r.servicecategoryid 
 	                                                  WHERE category IN('children','food','locate','price_c','relax','ser') 
                                                               AND r.userid=p_userid 
                                                               AND r.pointid=p_idel
LOOP
	RETURN next;
 END LOOP;
RETURN;
 END;$BODY$  LANGUAGE 'plpgsql' VOLATILE;

Большое спасибо. Следующий

Большое спасибо. Следующий запрос отработал как нужно.

CREATE OR REPLACE FUNCTION rating_point_list_(IN p_userid integer, IN p_idel integer, 
out oid servicecategory.id%TYPE, 
out otitle servicecategory.title%TYPE,
out ocategory servicecategory.category%TYPE,
out omark rating.mark%TYPE)
 returns setof record AS
$BODY$
 
BEGIN
 
 FOR oid, otitle, ocategory, omark IN SELECT s.id, s.title, s.category, r.mark 
		FROM servicecategory s LEFT OUTER JOIN rating r ON s.id = r.servicecategoryid 
 	        WHERE category IN('children','food','locate','price_c','relax','ser') 
                                                               AND r.userid=p_userid 
                                                               AND r.pointid=p_idel
LOOP
	RETURN next;
 END LOOP;
RETURN;
 END;$BODY$  LANGUAGE 'plpgsql' VOLATILE;

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

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

Back to top

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