2012-07-16 172 views
0

選中所有行我有一個PostgreSQL表:與存儲過程

| words | repl | 
| word1 | repl1 | 
| word2 | repl2 | 
| word3 | repl3 |  

我怎樣才能返回一組的所有文字和REPL與存儲過程。

我嘗試:

create function get_words() returns setof text as 
$$ 
declare 
    r varchar; 
begin 
    for r in 
     select word,repl from my_table 
     loop 
     return next r; 
    end loop; 
    return; 
end 
$$ language plpgsql; 

當我執行它,我只得到了一句話:

select * from get_words(); 
get_words 
----------- 
word1 
word2 
word3 

謝謝。

回答

1

您的函數被定義爲只返回一列(returns text)。此外,您正在讀取值的變量也是標量,並且不能保存多個值,因此只有字列被放入r變量中。

您需要將功能更改爲例如returns set of my_table和改變循環變量的定義:

create or replace function get_words() 
    returns setof my_table as 
$$ 
declare 
    r words%rowtype; 
begin 
    for r in select w.word, w.repl from my_table w 
    loop 
    return next r; 
    end loop; 
    return; 
end 
$$ language plpgsql; 

如果你不打算使用return query循環做任何事情,使事情變得更簡單:

create or replace function get_words() 
    returns table (word text, repl text) 
as 
$$ 
begin 
    return query select w.word, w.repl from words w; 
end 
$$ language plpgsql; 

你甚至可以進一步縮短這如果你不使用PL/pgSQL而是一個普通的SQL函數:

create or replace function get_words() 
    returns table (word text, repl text) 
as 
$$ 
    select w.word, w.repl from words w; 
$$ language sql;