sql - 定义返回多列的 Postgres SQL-lang 函数的正确方法是什么?

标签 sql postgresql stored-procedures

我有以下功能,基于SQL Functions Returning Sets PG 文档的部分,它接受两个长度相等的数组,并将它们解压成一组具有两列的行。

CREATE OR REPLACE FUNCTION unpack_test(
    in_int INTEGER[],
    in_double DOUBLE PRECISION[],
    OUT out_int INTEGER,
    OUT out_double DOUBLE PRECISION
) RETURNS SETOF RECORD AS $$
    SELECT $1[rowx] AS out_int, $2[rowx] AS out_double
    FROM generate_series(1, array_upper($1, 1)) AS rowx;
$$ LANGUAGE SQL STABLE;

我在 PGAdmin3 中执行该函数,如下所示:

SELECT unpack_test(int_col, double_col) FROM test_data

它基本上可以工作,但输出如下所示:

|unpack_test|
|record     |
|-----------|
|(1, 1)     |
|-----------|
|(2, 2)     |
|-----------|
 ...

换句话说,结果是一条记录,而不是两列。我发现this question这似乎提供了一个答案,但它处理一个直接从表中选择的函数,而我的接受列作为参数,因为它需要生成用于迭代它们的系列。因此,我无法按照该答案中的建议使用 SELECT * FROM function 来调用它。

最佳答案

首先,您需要 create a type作为函数的返回值。像这样的事情可能会起作用:

CREATE TYPE unpack_test_type AS (out_int int, out_double double precision);

然后更改您的函数以返回此类型而不是 record

然后你可以像这样使用它:

SELECT (unpack_test).out_int, (unpack_test).out_double FROM
        (SELECT unpack_test(int_col, double_col) FROM test_data) as test

似乎不可能采用返回通用记录类型的函数并以这种方式使用它。

关于sql - 定义返回多列的 Postgres SQL-lang 函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7165552/

相关文章:

java - 删除 Derby DB 中的所有表

javascript - 如何将 Postgres bytea 转换为 Base64 字符串

stored-procedures - OperationalError : (1414, 'OUT or INOUT argument 1 for routine ' 存储过程名称'不是 BEFORE 触发器中的变量或 NEW 伪变量')

mysql - 选择做出最积极贡献的用户

SQL查询获取数据表列值中架构表行值的值

SQL JOIN 在哪里放置 WHERE 条件?

sql - 选择前 n 个元素,使得累加和达到给定值

sql - PostgreSQL SELECT UNION 显示每个单独子查询的结果

java - "Select Distinct Null As xxxxx"是什么意思?

java - zxjdbc调用存储过程的正确用法是什么?