Greenplum/Postgres 8 函数动态结果集?

Posted

技术标签:

【中文标题】Greenplum/Postgres 8 函数动态结果集?【英文标题】:Greenplum/Postgres 8 function dynamic result set? 【发布时间】:2015-06-18 13:40:23 【问题描述】:

我需要编写一个函数来返回一个列数未知的表。 如果我在列输入参数中收到“无”,则该列不应包含在输出中。在 postgres 9+ 中有解决这个问题的方法。

如下所示:

CREATE OR REPLACE FUNCTION data_of(id integer,col1 varchar,col2 varchar, col3 varchar)
 RETURNS TABLE (count_rec, dimensions text[] ) AS
$func$
DECLARE

  _dimensions text := 'col1, col2, col3'; -- If i receive 'None' in input param then i exclude that from column list

BEGIN
  RETURN QUERY EXECUTE format('
  SELECT count(*) as count_rec,
        string_to_array($1)  -- AS dimensions
  FROM   x
  WHERE  id = $2'
, _dimensions)
USING  _dimensions , _id;
END
$func$ LANGUAGE plpgsql;

但在 Greenplum (Postgres 8.2) 中我找不到任何东西。有没有类似的解决方案?

谢谢

【问题讨论】:

【参考方案1】:

您有两种选择:使用返回“记录”的 set-returning 函数或返回您的自定义类型。

第一个选项:

create table test (a int, b int, c int, d varchar, e varchar, f varchar);
insert into test select id, id*2, id*3, (id*4)::varchar, (id*4)::varchar, (id*4)::varchar from generate_series(1,10) id;

create or replace function test_func(column_list varchar[]) returns setof record as $BODY$
declare
    r record;
begin
    for r in execute 'select ' || array_to_string(column_list, ',') || ' from test' loop
        return next r;
    end loop;
    return;
end;
$BODY$
language plpgsql
volatile;

select * from test_func(array['a','c','e']) as f(a int, c int, e varchar);

第二个选项:

create table test (a int, b int, c int, d varchar, e varchar, f varchar);
insert into test select id, id*2, id*3, (id*4)::varchar, (id*4)::varchar, (id*4)::varchar from generate_series(1,10) id;

create type testtype as (
    a int,
    c int,
    e varchar
);

create or replace function test_func() returns setof testtype as $BODY$
declare
    r testtype;
begin
    for r in execute 'select a,c,e from test' loop
        return next r;
    end loop;
    return;
end;
$BODY$
language plpgsql
volatile;

select * from test_func();

但我 99% 确定您是在尝试做错事。在 Greenplum 中,函数执行的结果不能用作连接条件中的“表”,因为函数在主节点上执行。由于此限制,您甚至无法从返回函数数据的最后一个查询中创建表 简而言之,这不是在 Greenplum 中处理数据的推荐方式

【讨论】:

以上是关于Greenplum/Postgres 8 函数动态结果集?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?

Spark Streaming 加入 GreenPlum/Postgres 数据。方法

jdbc 写入 greenplum/postgres 问题

无法在 psql GreenPlum 中分发

Spring基础篇(8)-Spring构造函数注入—实现子类的动态注入

8静态函数库设计