2013-02-06 38 views
1

我有一個集合返回函數(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]))返回上面描述的錯誤,我曾預料過一個表。
+0

是的。你寫的是正確的。你的問題是什麼?你不能在內部函數返回記錄集的地方運行select * from函數(function())。 – 2013-02-06 16:11:29

+0

問題在於如何執行數組中每個元素的函數並獲取表,而不使用一系列UNION語句。 – Matt

+1

好吧,你展示了它 - 選擇函數(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

回答

3

爲了避免「單列表」的問題,你需要明確擴大SRF結果與(row).*符號

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

如果我的理解@depesz,LATERAL將提供更有效或直接的達到相同結果的方式。

+0

正是我需要的,謝謝。 – Matt

相關問題