PostgreSQL return 一个数组或记录为一行

PostgreSQL return an Array or Record as a Row

我正在尝试 return 一个带有 returns row/rows 的 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;

我也试过 returning outputVar1 作为 TEXT[]。如果我使用 returns TEXT[](foo) 如果我使用 returns [=20=,我在客户端的 field 变量保持 {foo, bar} ].但这不是我需要的,它是来自 TEXT[] 数组或 RECORD 变量的 return 行,在开头和结尾没有任何 (), [], {} 字符输出。

如何更改我的 PostgreSQL 函数以使其工作?我想我错过了什么,但我看不到什么。

有很多方法可以做你想做的事。

如果您真的只是想要一栏,那么您可以简单地执行以下操作:

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)

然后 returned 列将被命名为 outputVar。如果 return 只有一列,Postgres 会强制 RETURNS 为该列类型,因此在这种情况下 SETOF TEXT 或仅 TEXT 如果需要一行。如果你 return 不止一列,那么你需要使用 RETURNS SETOF RECORD.

当您在函数参数中使用命名列时,您需要像为 DECLARE 部分的变量赋值一样为它们赋值:

LOOP
  outputVar := 'some value';
  outputVar2 := 'some value';
  outputVar3 := 'some value';
  RETURN NEXT;
END LOOP;

还有一些关于如何 return 从我的旧答案中的函数设置的其他示例: