Greenplum/Postgres 8 函数动态结果集?
Greenplum/Postgres 8 function dynamic result set?
我需要编写一个 returns 具有未知列数的 table 的函数。
如果我在列输入参数中收到 'None',则该列不应包含在输出中。在 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() -- AS dimensions
FROM x
WHERE id = '
, _dimensions)
USING _dimensions , _id;
END
$func$ LANGUAGE plpgsql;
但是在 Greenplum (Postgres 8.2) 中我找不到任何东西。有没有类似的解决办法?
谢谢
您有 2 个选择:使用设置返回函数返回 "record" 或返回您的自定义类型。
第一个选项:
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 中,函数执行的结果不能用作连接条件中的 "table",因为该函数在 master 上执行。由于此限制,您甚至无法从最后一个从函数返回数据的查询中创建 table
简而言之,这不是在 Greenplum
中处理数据的推荐方式
我需要编写一个 returns 具有未知列数的 table 的函数。 如果我在列输入参数中收到 'None',则该列不应包含在输出中。在 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() -- AS dimensions
FROM x
WHERE id = '
, _dimensions)
USING _dimensions , _id;
END
$func$ LANGUAGE plpgsql;
但是在 Greenplum (Postgres 8.2) 中我找不到任何东西。有没有类似的解决办法?
谢谢
您有 2 个选择:使用设置返回函数返回 "record" 或返回您的自定义类型。
第一个选项:
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 中,函数执行的结果不能用作连接条件中的 "table",因为该函数在 master 上执行。由于此限制,您甚至无法从最后一个从函数返回数据的查询中创建 table 简而言之,这不是在 Greenplum
中处理数据的推荐方式