我正在尝试使用返回行的 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/