我有一组用户定义的复合数据类型。我需要对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
答案 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填充了一个非常重要的利基)。