2014-04-25 50 views
0

我在Postgres中有一個返回setof複合類型的函數。在返回時,我只能用return next;而不是用return query命令來做,爲什麼?在複合類型的Postgres 9.0函數中使用返回查詢

CREATE TYPE return_type AS 
    (paramname character varying, 
    value character varying); 

CREATE OR REPLACE FUNCTION test(i_param1 character varying, i_param2 character varying) 
     RETURNS SETOF return_type AS 

    --this works just fine returning two rows 
    r.paramname:='row1'; 
    r.value:='myvalue1'; 
    return next r;   
    r.paramname:='row1'; 
    r.value:='myvalue1'; 
    return next r; 
    return; 

    -- with this command I do not get a single row attached in the resultset 
    return query 
    select 'row1' as paraName,'myvalue1' as value 
    UNION ALL 
    select 'row2' as paraName,'myvalue2' as value; 
    return; 

回答

1

這個工作對我來說,即使是在Postgres的8.4:

CREATE OR REPLACE FUNCTION test(i_param1 varchar, i_param2 varchar) 
    RETURNS SETOF return_type AS 
$func$ 
BEGIN 
    RETURN QUERY 
    SELECT 'row1'::varchar, 'myvalue1'::varchar 
    UNION ALL 
    SELECT 'row2','myvalue2'; 
END 
$func$ LANGUAGE plpgsql; 

你原來應該只返回,因爲類型不匹配的除外。你需要轉換字符串文字到匹配類型。另一方面,列別名在這裏是不相關的:在函數體外部不可見。

SQL Fiddle

+0

好@erwin獲取函數結果時,我已經沒有任何異常迄今就類型mistamatch,所以我不認爲這是我的問題。它應該返回一行時返回0行。關於別名,我無權更改。 – Douglas

+1

@Douglas:查詢中的別名不需要*更改。他們只是噪音。至於結果:你看過提供的小提琴嗎?它顯然適用於Postgres 8.4和9.1。再也沒有任何9.0裝置了。 9.0並不是特別受歡迎的版本,現在正在變老。如果這不能解決您的問題,請提供一個*完整的*函數定義 - 就像您應該從頭開始 - 因此我們可以嘗試重現您的發現。 –

+0

是的,你是對的@Erwin,可以肯定地說,我需要使用該版本的Postgres,因爲Postgres的新版本在使用的平臺上存在兼容性問題。我跑了一些測試,看起來你是正確的我需要投入字符串文字,但出於某種原因,它沒有拋出任何錯誤。謝謝! – Douglas