gpt4 book ai didi

c++ - PostgreSQL 将数组或记录作为行返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:02 27 4
gpt4 key购买 nike

我正在尝试使用返回行的 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 函数以使其工作?我想我错过了什么,但我看不到什么。

最佳答案

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

如果它确实只是您想要的一列,那么您可以简单地执行以下操作:

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 部分的变量赋值一样为它们赋值:

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

在我的旧答案中,还有一些关于如何从函数返回集合的其他示例:How to return rows of query result in PostgreSQL's function?

关于c++ - PostgreSQL 将数组或记录作为行返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com