Sql postgres:具有非类型化返回值的函数
我正在寻找一种定义postgres函数的方法,该函数允许返回非类型化的行值。为便于论证,假设存在以下表格:Sql postgres:具有非类型化返回值的函数,sql,postgresql,dynamic-sql,stored-functions,Sql,Postgresql,Dynamic Sql,Stored Functions,我正在寻找一种定义postgres函数的方法,该函数允许返回非类型化的行值。为便于论证,假设存在以下表格: create table foo( id serial primary key, value1 varchar(255), value2 int, value3 datetime, value4 boolean ); 我们还有一个函数,允许我们返回某些列的结果(这是一个相当做作的示例,但实际上,很多连接都是在内部发生的,我希望通过仅使用相关列来最小化这些连接): 由于
create table foo(
id serial primary key,
value1 varchar(255),
value2 int,
value3 datetime,
value4 boolean
);
我们还有一个函数,允许我们返回某些列的结果(这是一个相当做作的示例,但实际上,很多连接都是在内部发生的,我希望通过仅使用相关列来最小化这些连接):
由于列值取决于所选列参数,因此无法预先定义返回表。是否有任何方法可以返回行而不指定其值?我已经考虑过返回光标,但我不确定这是否是最好的选择
(可以定义postgresql版本)您需要返回
setof record
()
问题是您必须在函数外部声明列类型:
SELECT * from foo_func('value1','value2') as (a varchar(255),b int);
如果声明不匹配,您将得到一个错误:与只选择整个表相比,我没有注意到任何性能影响,这很好。这当然可能是由于sqlfiddle缺少样本或不准确。这个返回循环是否比一个
select
的速度慢?@orange-sqlfiddle肯定不是测试的合适地方,因为它只允许非常有限的数据,而且它的性能变化很大。不过我对这个循环一无所知。这是诱人的,因为它打印的时间也。。。我将尝试运行更彻底的测试。@橙色如果您使用psql运行测试,您可以使用\timing
打开时间显示。
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);