Есть много способов сделать то, что вы хотите.
Если вам нужен только один столбец, то вы можете просто сделать:
CREATE OR REPLACE FUNCTION seal_diff_benchmark_pgsql(sealparams CHARACTER VARYING)
RETURNS SETOF TEXT AS $outputVar$
DECLARE
tempVar1 CHARACTER VARYING;
tempVar2 CHARACTER VARYING;
sealArray TEXT[];
execTime NUMERIC[];
outputVar text;
BEGIN
FOR i IN 1..2 LOOP
SELECT "Pickup_longitude", "Dropoff_longitude" INTO tempVar1, tempVar2
FROM public.nyc2015_09_enc WHERE id=i;
sealArray := (SELECT public.seal_diff_benchmark(tempVar1, tempVar2, sealparams));
execTime[i] := sealArray[2];
FOREACH outputVar IN ARRAY sealArray[1] LOOP --iterate over that text array
RETURN NEXT outputVar;
END LOOP;
END LOOP;
END;
$outputVar$ LANGUAGE plpgsql;
Возвращенный столбец будет назван так же, как функция.
SELECT seal_diff_benchmark_pgsql FROM seal_diff_benchmark_pgsql('stuff');
-- alternative
SELECT seal_diff_benchmark_pgsql('stuff');
Вы также можете указать столбцы в параметрах функции:
CREATE OR REPLACE FUNCTION seal_diff_benchmark_pgsql(sealparams CHARACTER VARYING, OUT outputVar text)
Тогда возвращаемый столбец будет называться outputVar
. В случае возврата только одного столбца Postgres заставляет RETURNS
быть этого типа столбца, поэтому в этом случае SETOF TEXT
или просто TEXT
, если ожидается одна строка. Если вы возвращаете более одного столбца, вам нужно использовать RETURNS SETOF RECORD
.
Когда вы используете именованные столбцы в параметрах функции, вам нужно присваивать им значения так же, как и переменным из DECLARE
section:
LOOP
outputVar := 'some value';
outputVar2 := 'some value';
outputVar3 := 'some value';
RETURN NEXT;
END LOOP;
Вот несколько других примеров того, как вернуть наборы из функций в моем старом ответе: Как вернуть строки результата запроса в функции PostgreSQL?