2013-05-21 46 views
1

函数返回的结果我有一个功能,看起来像这样:从“select语句”格式

CREATE OR REPLACE FUNCTION mffcu.test_ty_hey() 
RETURNS setof record 
LANGUAGE plpgsql 
AS $function$ 
Declare 
     cname1 text; 
     sql2 text;  
Begin 
for cname1 in 
select array_to_string(useme, ', ') from (
select array_agg(column_name) as useme 
from(
select column_name::text 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'crosstab_183' 
and ordinal_position != 1 
) as fin 
) as fine 
loop 
sql2 := 'select distinct array['|| cname1 ||'] from mffcu.crosstab_183'; 
execute sql2; 
end loop; 
END; 
$function$ 

我调用函数与此:

select mffcu.test_ty_hey() 

如何返回结果sql2查询没有创建表/临时表?

+0

你忘了提及你的PostgreSQL版本。 –

+0

@ErwinBrandstetter它是psql版本9.1,服务器版本9.0。 – precose

回答

3

虽然@Pavel是正确的,当然,你很令人费解的功能可能是解开来:

CREATE OR REPLACE FUNCTION mffcu.test_ty_hey() 
    RETURNS SETOF text[] LANGUAGE plpgsql 
AS $func$ 
DECLARE 
    cname1 text; 
BEGIN 

FOR cname1 IN 
    SELECT column_name::text 
    FROM information_schema.columns 
    WHERE table_name = 'crosstab_183' 
    AND table_schema = 'mffcu' 
    AND ordinal_position <> 1 
LOOP 
    RETURN QUERY 
    EXECUTE format('SELECT DISTINCT ARRAY[%I::text] 
        FROM mffcu.crosstab_183', cname1); 
END LOOP; 

END 
$func$ 

format()需要PostgreSQL 9.1或更高版本。

EXECUTE 'SELECT DISTINCT ARRAY['|| quote_ident(cname1) ||'::text] 
     FROM mffcu.crosstab_183'; 

电话预订:9.0,你可以用替代

select * FROM mffcu.test_ty_hey();

通过每列铸造text我们那个可以用来声明RETURN类型一致的数据类型到达。这种妥协必须从一个函数返回各种数据类型。每种数据类型可以转换为text,这是显而易见的共同点。

顺便说一句,我很难想象ARRAY围绕每一个值包装应该是有益的。我想你可以放弃这一点。

+1

此代码不执行任何操作,您必须使用RETURN QUERY EXECUTE。仅EXECUTE的结果不会被转发到输出。 –

+1

@PavelStehule:谢谢。添加了缺少'RETURN QUERY'。 –

+0

添加RETURN QUERY时出现此错误:返回不能在函数中返回参数 set;在“QUERY”处或其附近使用RETURN NEXT – precose

2

PostgreSQL函数在执行前应该有固定的结果类型。您不能在执行后期指定类型。只有两种解决方法 - 使用临时表或使用游标。

PLpgSQL语言不适用于过于普遍的例程 - 它对于实现严格和清洁的业务规则很有好处。对通用交叉表计算或通用审计或类似的通用任务不利。它可以工作,但代码速度较慢,通常不易维护。

但回答您的查询,你可以使用输出光标

例如http://okbob.blogspot.cz/2008/08/using-cursors-for-generating-cross.html