Я новичок в PostgreSQL, и у меня возникли некоторые проблемы с тем, чтобы заставить его делать то, что я хочу.
Мне нужно создать функцию, которая будет принимать несколько переменных, выполнять несколько внутренних запросов, а затем возвращать набор данных, состоящий из нескольких строк и нескольких столбцов. Я создал несколько тестовых функций, чтобы лучше понять функциональность Postgres, вот одна из них:
CREATE OR REPLACE FUNCTION sql_with_rows11(id integer) RETURNS character varying AS $BODY$
declare vid integer;
declare vendor character varying;
BEGIN
vid := (select v_id from public.gc_alerts where a_id = id);
vendor := (select v_name from public.gc_vendors where v_id = vid);
RETURN vendor;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sql_with_rows11(integer)
OWNER TO postgres;
Я знаю, что могу объединить это в один запрос, но это скорее практическое упражнение. Это нормально работает, и я получаю имя поставщика. Однако теперь мне нужно вернуть более одного столбца из таблицы gc_vendors
.
В конце концов, мне нужно будет создать функцию, которая будет возвращать столбцы из нескольких таблиц на основе подзапросов. Я рассмотрел возможность создания функции набора результатов, но я считаю, что она возвращает только одну строку за раз. Я также рассмотрел возвращаемый тип setof, но, похоже, это ограничено существующей таблицей.
--------------РЕДАКТИРОВАТЬ
Привет, ребята, спасибо за помощь. Я изменил функцию на следующую:
CREATE OR REPLACE FUNCTION sql_with_rows14(IN v_uid character varying, IN lid integer)
RETURNS table (aid int, aname character varying) AS $BODY$
declare aid integer;
declare aname character varying;
BEGIN
sql_with_rows14.aid := (select a_id from public.gc_alerts where v_id = sql_with_rows14.v_uid);
sql_with_rows14.aname := (select a_name from public.gc_alerts where a_id = sql_with_rows14.aid);
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
Я также пробовал это с RETURN NEXT, но результаты те же.
Когда я запрашиваю его, если запрос возвращает только одну строку, он работает нормально. Однако это не работает для нескольких строк. Я тоже пробовал что-то подобное, с теми же результатами. Ребята, вы можете снова помочь?
Пробовал и это: BEGIN sql_with_rows14.aid: = (выберите a_id из public.gc_alerts); sql_with_rows14.aname: = (выберите a_name из public.gc_alerts);
RETURN NEXT;
END;