postgres:具有无类型返回值的函数

时间:2013-04-24 07:40:43

标签: sql postgresql dynamic-sql stored-functions

我正在寻找一种方法来定义一个允许返回无类型行值的postgres函数。为了论证,让我们假设存在以下表格:

create table foo(
  id serial primary key,
  value1 varchar(255),
  value2 int,
  value3 datetime,
  value4 boolean
);

我们还有一个函数允许我们返回某些列的结果(这是一个相当人为的例子,但实际上,很多连接在内部发生,我希望通过仅使用相关列来最小化):

create or replace function foo_func(col1 text, col2 text) returns 
  table(?, ?) as 
$$
declare 
sql text;
begin
  sql := 'select ' || col1 || ', ' || col2 || ' from foo'
  return execute sql;
end
$$ language plpgsql;

由于列值取决于所选的列参数,因此无法预先定义返回表。有没有办法在不指定值的情况下返回行?我已经考虑过返回光标,但我不确定这是否是最佳选择。

(可以定义postgresql版本)

1 个答案:

答案 0 :(得分:1)

您需要返回setof recordref)。

create or replace function foo_func(col1 text, col2 text) returns 
  setof record as 
$$
declare 
sql text;
r record;
begin
  sql := 'select ' || col1 || ', ' || col2 || ' from foo';
  for r in execute sql
  loop
    return next r;
  end loop;
  return;
end
$$ language plpgsql;

问题是您必须在函数外声明列类型:

SELECT * from foo_func('value1','value2') as (a varchar(255),b int);

如果声明不匹配,您将收到错误:http://sqlfiddle.com/#!12/ce8b0/3