PostgreSQL возвращает массив или запись в виде строки - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь вернуть переменную с помощью функции PostgreSQL, которая возвращает строку / строку, чтобы я мог использовать libpqxx на стороне клиента для итерации по ней, например, используя:

for (pqxx::result::const_iterator row = result.begin(); row != result.end(); row++)
    {
        for (pqxx::const_row_iterator field = row.begin(); field != row.end(); field++) 
            {
                cout << field << '\n';
            }
        }

Это моя функция PostgresSQL:

CREATE OR REPLACE FUNCTION seal_diff_benchmark_pgsql(sealparams CHARACTER VARYING) RETURNS RECORD AS $outputVar$
DECLARE
    tempVar1 CHARACTER VARYING;
    tempVar2 CHARACTER VARYING;
    outputVar1 TEXT[];
    outputVar record;
    sealArray TEXT[];
    execTime NUMERIC[];
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));
        outputVar1[i] := sealArray[1];
        execTime[i] := sealArray[2];
    END LOOP;

    SELECT UNNEST(outputVar1) INTO outputVAR;
    RETURN outputVar;
END;
$outputVar$ LANGUAGE plpgsql;

Я также пытался вернуть outputVar1 как TEXT[]. Моя field переменная на стороне клиента содержит {foo, bar}, если я использую, возвращает TEXT[] или (foo), если я использую, возвращает RECORD. Но это не то, что мне нужно, это строка типа возврата из массива TEXT[] или переменной RECORD без каких-либо символов (), [], {} в начале и в конце вывода.

Как я могу изменить свою функцию PostgreSQL, чтобы она работала? Я думаю, что что-то упустил, но я не вижу, что.

1 Ответ

0 голосов
/ 28 августа 2018

Есть много способов сделать то, что вы хотите.

Если вам нужен только один столбец, то вы можете просто сделать:

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?

...