如何访问plpgsql复合类型数组组件

时间:2012-11-15 11:22:55

标签: postgresql plpgsql

假设我在Postgresql中创建了一个复合类型:

CREATE TYPE custom_type AS
   (x integer
    y integer);

我需要在函数中使用它作为数组:

...
DECLARE
customVar custom_type[];
BEGIN
....

我的问题是:如何访问custom_type的特定组件?

例如,我想(重新)为custom_type数组中的第三个元素指定'x'...

2 个答案:

答案 0 :(得分:2)

假设:

SELECT ARRAY[(1,2),(3,4)]::custom_type[];

使用数组下标,然后按名称引用该字段。

regress=> SELECT (ARRAY[(1,2),(3,4)]::custom_type[])[1].x;
 x 
---
 1
(1 row)

答案 1 :(得分:2)

postgres=> create type pt as (x int, y int);
CREATE TYPE

postgres=> create or replace function fx()
returns void as $$
declare a pt[] = ARRAY[(10,20),(30,40)]; declare xx pt;
begin
  for i in array_lower(a, 1) .. array_upper(a,1)
  loop
    xx = a[i]; xx.x := xx.x + 1; a[i] := xx; raise notice '%', a[i].x;
  end loop;
end;
$$ language plpgsql;
CREATE FUNCTION
postgres=> select fx();
NOTICE:  11
NOTICE:  31
 fx 
────

(1 row)

assign语句的目标的重要限制是可能仅引用一个级别的嵌套属性。辅助变量可以绕过这个限制 - 它不太友好 - 内部实现太简单了,但它对于典型的存储过程使用来说速度快且足够,尽管它与通用编程语言相比并不强大。