选择存储过程的所有行

时间:2012-07-16 08:33:16

标签: sql postgresql stored-procedures

我有一个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 个答案:

答案 0 :(得分: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;