2013-05-21 48 views
1

函數返回的結果我有一個功能,看起來像這樣:從「select語句」格式

CREATE OR REPLACE FUNCTION mffcu.test_ty_hey() 
RETURNS setof record 
LANGUAGE plpgsql 
AS $function$ 
Declare 
     cname1 text; 
     sql2 text;  
Begin 
for cname1 in 
select array_to_string(useme, ', ') from (
select array_agg(column_name) as useme 
from(
select column_name::text 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'crosstab_183' 
and ordinal_position != 1 
) as fin 
) as fine 
loop 
sql2 := 'select distinct array['|| cname1 ||'] from mffcu.crosstab_183'; 
execute sql2; 
end loop; 
END; 
$function$ 

我調用函數與此:

select mffcu.test_ty_hey() 

如何返回結果sql2查詢沒有創建表/臨時表?

+0

你忘了提及你的PostgreSQL版本。 –

+0

@ErwinBrandstetter它是psql版本9.1,服務器版本9.0。 – precose

回答

3

雖然@Pavel是正確的,當然,你很令人費解的功能可能是解開來:

CREATE OR REPLACE FUNCTION mffcu.test_ty_hey() 
    RETURNS SETOF text[] LANGUAGE plpgsql 
AS $func$ 
DECLARE 
    cname1 text; 
BEGIN 

FOR cname1 IN 
    SELECT column_name::text 
    FROM information_schema.columns 
    WHERE table_name = 'crosstab_183' 
    AND table_schema = 'mffcu' 
    AND ordinal_position <> 1 
LOOP 
    RETURN QUERY 
    EXECUTE format('SELECT DISTINCT ARRAY[%I::text] 
        FROM mffcu.crosstab_183', cname1); 
END LOOP; 

END 
$func$ 

format()需要PostgreSQL 9.1或更高版本。

EXECUTE 'SELECT DISTINCT ARRAY['|| quote_ident(cname1) ||'::text] 
     FROM mffcu.crosstab_183'; 

電話預訂:9.0,你可以用替代

select * FROM mffcu.test_ty_hey();

通過每列鑄造text我們那個可以用來聲明RETURN類型一致的數據類型到達。這種妥協必須從一個函數返回各種數據類型。每種數據類型可以轉換爲text,這是顯而易見的共同點。

順便說一句,我很難想象ARRAY圍繞每一個值包裝應該是有益的。我想你可以放棄這一點。

+1

此代碼不執行任何操作,您必須使用RETURN QUERY EXECUTE。僅EXECUTE的結果不會被轉發到輸出。 –

+1

@PavelStehule:謝謝。添加了缺少'RETURN QUERY'。 –

+0

添加RETURN QUERY時出現此錯誤:返回不能在函數中返回參數 set;在「QUERY」處或其附近使用RETURN NEXT – precose

2

PostgreSQL函數在執行前應該有固定的結果類型。您不能在執行後期指定類型。只有兩種解決方法 - 使用臨時表或使用遊標。

PLpgSQL語言不適用於過於普遍的例程 - 它對於實現嚴格和清潔的業務規則很有好處。對通用交叉表計算或通用審計或類似的通用任務不利。它可以工作,但代碼速度較慢,通常不易維護。

但回答您的查詢,你可以使用輸出光標

例如http://okbob.blogspot.cz/2008/08/using-cursors-for-generating-cross.html