通用集返回功能

时间:2014-11-21 17:21:05

标签: sql postgresql plpgsql dynamic-sql set-returning-functions

我有一个plpgsql函数,它作为几个其他函数的包装器,所有函数都设置为返回不同数据类型的函数。通过这个函数,我试图得到一个泛型集返回函数,它可以返回任何数据类型的集合。记录的数据类型根据输入表名和列名决定。

以下是代码段:

create function cs_get(tablename text, colname text) returns setof record as $$ 
declare
    type_name text;
    ctype text;
    loadfunc text;
    result record;
begin                                              
    select data_type into type_name from information_schema.columns where table_name = tablename and column_name = colname;
     if type_name is null then 
         raise exception 'Table % doesnot exist or does not have attribute % ',tablename,    colname;
    end if;

    ctype := cs_get_ctype(type_name);
    loadfunc := 'select * from cs_get_'||ctype||'('''||tablename||''','''||colname||''')';
    for result in execute loadfunc loop
        return next result;
    end loop;
    return;                                                      
end; $$ language plpgsql;

假设列的类型为整数(对应的c类型为int64), loadfunc 将是

select * from cs_get_int64(tablename, colname)

cs_get_int64 是在C库中定义的set-returns函数,它返回类型为int64的值。

但是,这会导致错误

ERROR:  a column definition list is required for functions returning "record" at character 15

实现此目的的最简单方法是为每种数据类型返回setof text。但那当然不是一个干净的方式来做到这一点。我尝试用

替换loadFunc
select cs_get_int64::integer from cs_get_int64(tablename, colname)

这是使用记录所必需的。但是,这没有用。

我现在的问题是: 是否可以创建这样的通用集返回函数?如果有,怎么样?

1 个答案:

答案 0 :(得分:2)

答案是。但这并非无足轻重。

只要您返回匿名记录returns setof record),就需要在SQL中使用返回记录的列定义列表。几乎是错误信息所说的内容。

polymorphic types 有一种(有限的)方式:

CREATE OR REPLACE FUNCTION cs_get(_tbl_type anyelement, _colname text)
  RETURNS SETOF anyelement AS

...

这个相关答案的详细解释(上一章的高潮!):