Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql postgres:具有非类型化返回值的函数_Sql_Postgresql_Dynamic Sql_Stored Functions - Fatal编程技术网

Sql 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 ); 我们还有一个函数,允许我们返回某些列的结果(这是一个相当做作的示例,但实际上,很多连接都是在内部发生的,我希望通过仅使用相关列来最小化这些连接): 由于

我正在寻找一种定义postgres函数的方法,该函数允许返回非类型化的行值。为便于论证,假设存在以下表格:

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);