1

整数引数を受け入れ、テーブルから行のセットを返すセット戻り関数(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]))上記のエラーを返します、私はテーブルを期待していました。
4

1 に答える 1

3

「単一列のテーブル」の問題を回避するには、SRFの結果を(row).*表記法で明示的に展開する必要があります。

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

@depeszを理解した場合LATERAL、同じ結果を達成するためのより効率的または簡単な方法を提供します。

于 2013-02-06T17:33:04.547 に答える