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

时间:2013-02-06 16:06:51

标签: postgresql plpgsql

我有一个set-returns函数(SRF),它接受一个整数参数并从表中返回一组行。我使用SELECT * FROM tst.mySRF(3);调用它,然后像返回的表一样操纵返回的值。

我想要做的是在数组的每个元素上执行它;但是,当我使用SELECT * FROM tst.mySRF(unnest(array[3,4]));调用它时,会返回一个错误“在上下文中调用的set-valued函数,它不能接受一个集合”。如果我改为使用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]))返回上述错误,我原本预计会有一张桌子。

1 个答案:

答案 0 :(得分:3)

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

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

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