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 从我的旧答案中的函数设置的其他示例:
我正在尝试 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 从我的旧答案中的函数设置的其他示例: