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

谢谢你。

4

1 回答 1

1

您的函数被定义为仅返回一列 ( returns text)。此外,您正在读取值的变量也是一个标量,并且不能包含多个值,因此只有单词 column 被放入r变量中。

您需要将函数更改为 egreturns 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;
于 2012-07-16T09:01:58.833 回答