postgresql - 使用数组中的每个元素调用 set-returning 函数

标签 postgresql plpgsql

我有一个集合返回函数 (SRF),它接受一个整数参数并从表中返回一组行。我使用 SELECT * FROM tst.mySRF(3); 调用它,然后像处理表格一样处理返回值。

我想做的是对数组的每个元素执行它;但是,当我使用 SELECT * FROM tst.mySRF(unnest(array[3,4])); 调用它时,返回错误“在无法接受集合的上下文中调用的集合值函数”。如果我改为使用 SELECT tst.mySRF(unnest(array[3,4])); 调用它,我会得到一组 tst.tbl

表定义:

DROP TABLE tst.tbl CASCADE;
CREATE TABLE tst.tbl (
    id  serial  NOT NULL,
    txt text    NOT NULL,
    PRIMARY KEY (id)
);
INSERT INTO tst.tbl(txt) VALUES ('a'), ('b'), ('c'), ('d');

函数定义:

CREATE OR REPLACE FUNCTION tst.mySRF(
    IN  p_id            integer
)
    RETURNS setof tst.tbl
    LANGUAGE plpgsql
    AS $body$
        DECLARE
        BEGIN
            RETURN QUERY
                SELECT id, txt
                FROM tst.tbl
                WHERE id = p_id;
        END;
    $body$;

调用:

  • SELECT * FROM tst.mySRF(3) 按预期返回一个表。
  • SELECT tst.mySRF(unnest(array[3,4])) 按预期返回一个表,其中包含类型为 tst.tbl 的单个列。
  • SELECT * FROM tst.mySRF(unnest(array[3,4])) 返回上述错误,我曾期待一个表格。

最佳答案

为避免“单列表”问题,您需要使用(row).* notation显式扩展SRF结果

 SELECT (tst.mySRF(unnest(array[3,4]))).*;

如果我理解@depesz,LATERAL 将提供一种更有效或更直接的方法来实现相同的结果。

关于postgresql - 使用数组中的每个元素调用 set-returning 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14733470/

相关文章:

mysql - 优化与数据库的工作

PostgreSQL 用户定义类型成员比较

postgresql - 强制 PostgreSQL 在函数中使用不同的模式

sql - Postgresql,将数据从外部表复制到新表

ruby-on-rails - Errno::ECONNREFUSED 由于目标机器主动拒绝,无法建立连接。 - 在 Rails 应用程序中使用 connect(2) 进行 Mongodb 搜索

postgresql - plpgsql 函数内的事务

database - 如何在触发器函数中将 OLD、NEW 和标识符传递给 EXECUTE?

postgresql - 临时表不是已知变量

PHP PostgreSQL 数组到字符串

postgresql - 为什么我的空 postgres 数据库是 7MB?