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

标签 c++ postgresql libpq libpqxx

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

相关文章:

postgresql - 如何使用 libpq 的 pgpass 连接到 postgresql,而不指定纯文本密码?

c++ - 如何解析这些未知大小的数据

mysql - 将 MySQL "get top y for each n"GROUP BY 查询转换为 PostgreSQL

sql - 使用部分计数连接多个表

postgresql - 动态参数数组

python - Fedora30 上 libpq.so.5 和 PQencryptPasswordConn 版本 RHPG_10 的问题

c - 用 C 编写数据库抽象层的好策略

c++ - 搜索多维 vector

c++ - 计算矩阵的 n 次方

C++将长字符串传递给构造函数或setter