我有一個集合返回函數(SRF),它接受一個整數參數並從表中返回一組行。我使用SELECT * FROM tst.mySRF(3);
來調用它,然後像返回一個表一樣處理返回的值。使用數組中的每個元素調用set-returning函數
我想要做的是在數組的每個元素上執行它;但是,當我使用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]))
返回上面描述的錯誤,我曾預料過一個表。
是的。你寫的是正確的。你的問題是什麼?你不能在內部函數返回記錄集的地方運行select * from函數(function())。 – 2013-02-06 16:11:29
問題在於如何執行數組中每個元素的函數並獲取表,而不使用一系列UNION語句。 – Matt
好吧,你展示了它 - 選擇函數(other_function())。如果你出於任何原因不能這樣做,在9.3上,你可以使用LATERAL,並且在之前的版本中 - 使用我在這裏描述的workaroud:http://www.depesz.com/2012/08/19/waiting- for-9-3-implement -sql-standard-lateral-subqueries/ – 2013-02-06 16:55:45