访问复合数组元素 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 填补了一个非常重要的位置)。
我有一组用户定义的复合数据类型。我需要对 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 填补了一个非常重要的位置)。