2011-11-17 88 views
0

我試圖定義的線沿線的一個功能:PostgreSQL函數的返回類型

CREATE FUNCTION myfunction(list_of_ids integer[]) RETURNS record AS $$ 
    SELECT a.col1, b.col2 FROM a, b WHERE col1 = ANY($1); 
$$ LANGUAGE 'sql' 

的Postgres似乎但是不快樂「記錄」作爲返回類型,給我這個錯誤,當我嘗試執行功能:

ERROR: a column definition list is required for functions returning "record" 

縱觀文檔,雖然我不能解決如何提供此列定義列表。

+0

如果您在執行該功能的位置顯示語句,這將更具啓發性。 –

回答

0

我結束了使用該準備的查詢,而不是 - 我真正想要的是確保分析查詢並生成查詢計劃的開銷,每次都被淘汰,所以準備好的聲明對此很有效。

2

首先,您的查詢似乎關閉:否JOIN條件ab?你不想要笛卡爾產品,是嗎?嘗試是這樣的:

SELECT a.col1, b.col2 
FROM a 
JOIN b ON <some condition like b.a_id = a.a_id> 
WHERE col1 = ANY($1); 

接下來,使用返回類型爲功能,這樣你就不必爲每次調用一個字段定義列表。在這個例子中我使用了RETURNS TABLE。閱讀關於more ways in the manual。 看起來是這樣的:

CREATE FUNCTION myfunction(list_of_ids integer[]) 
RETURNS TABLE (
    col1 text -- has to match the type of the column a.col1 that is returned. 
,col2 text -- match type of a.col2 
) AS 
$$ 
    SELECT a.col1, b.col2 
    FROM a 
    JOIN b ON <some condition like b.a_id = a.a_id> 
    WHERE col1 = ANY($1); 
$$ 
    LANGUAGE sql; 

圍繞「SQL」的單引號只是噪音。它可以作爲關鍵詞。

現在,您可以撥打:

SELECT * FROM myfunction('{11,23,6}'::integer[]);