2013-04-24 181 views
0

我正在寻找一种方法来定义允许返回无类型行值的postgres函数。为了讨论的缘故,让我们假设下表存在: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

您需要返回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

+0

大。我以前没见过这个。我会尝试一下...... – orange 2013-04-24 08:48:18

+0

与仅仅选择整个表相比,我没有注意到任何性能问题,这很好。这当然可能是由于缺少样本或sqlfiddle中的不准确之处。这个返回循环是否比只选择'select'慢? – orange 2013-04-25 13:07:41

+0

@orange sqlfiddle肯定不适合进行测试,因为它只允许非常有限的数据,并且性能差别很大。虽然我对循环没有任何意见。 – 2013-04-25 13:31:12

相关问题