访问复合数组元素plpgsql

时间:2016-08-18 23:31:10

标签: arrays postgresql plpgsql custom-data-type

我有一组用户定义的复合数据类型。我需要对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;

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

错误:“或”附近的语法错误。    第5行:mod [i] .a = 1;

我正在使用Postgres 9.2

2 个答案:

答案 0 :(得分: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$;

答案 1 :(得分:0)

继续上面的Pavel的回答,你可以进一步简化为一个普通的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填充了一个非常重要的利基)。