访问复合数组元素 plpgsql

access composite array elements 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;

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

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

我正在使用 Postgres 9.2

左边的表达式在 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$;

按照上面 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 填补了一个非常重要的位置)。