2016-08-18 81 views
1

我有一个用户定义的复合数据类型的数组。我需要对plpgsql函数中的数组元素进行一些操作,但是我没有获得访问各个元素的语法权限。任何帮助表示赞赏。下面粘贴的是代码的简化版本。访问复合数组元素plpgsql

CREATE TYPE playz AS(
        a integer, 
        b numeric, 
        c integer, 
        d numeric); 

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
BEGIN 
    FOR i in 1..5 LOOP 
     mod[i].a = 1; 
     mod[i].b = 12.2; 
     mod[i].c = 1; 
     mod[i].d = 0.02; 

    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

当我尝试执行此操作时出现以下错误。

错误:语法错误处于或接近“。”。 LINE 5:mod [i] .a = 1;

我使用的是Postgres 9.2

回答

3

左边的表达式在PLpgSQL中必须非常简单。不支持数组和复合类型的组合。您应该设置复合类型的值,然后将此值分配给数组。

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
DECLARE r playz; 
BEGIN 
    FOR i in 1..5 LOOP 
    r.a = 1; 
    r.b = 12.2; 
    r.c = 1; 
    r.d = 0.02; 
    mod[i] = r; 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

有可能的快捷方式:

CREATE OR REPLACE FUNCTION public.playx(OUT mod playz[]) 
LANGUAGE plpgsql 
AS $function$ 
BEGIN 
    FOR i in 1..5 LOOP 
    mod[i] = ROW(1, 12.2, 1, 0.02); 
    END LOOP; 
END; 
$function$; 
0

以上帕维尔的回答之后,你就可以进一步简化此为普通的SQL函数(它给你更好的规划师的透明度和类型检查),如果你做类似:

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
select array_agg(row(1, 12.2, 1, 0.02)::playz) 
    from generate_series(1, 5) 
$$ LANGUAGE sql; 

我通常尝试使用普通的SQL函数时,我可以(PL/pgsql填补了一个非常重要的利基虽然)。