2012-11-15 24 views
1

比方說,我創建了一個PostgreSQL中的複合型:如何訪問PLPGSQL複合型陣列組件

CREATE TYPE custom_type AS 
    (x integer 
    y integer); 

我需要使用它的功能作爲數組:

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

我問題是:我如何訪問custom_type的特定組件?

例如,我想(重新)分配的「x」爲在CUSTOM_TYPE陣列的第三個元素...

回答

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) 

的賦值語句的目標的重大限制的可能性是指只有一層嵌套的特性。這個限制可以被輔助變量繞過 - 它不太友好 - 內部實現過於簡單,但它對於典型的存儲過程使用來說是快速和足夠的,儘管它與通用編程語言相比並不強大。

2

鑑於:

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

使用數組下標,然後參照以場按名字。

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

它適用於閱讀目的,但如何重新分配元素? –

+0

@Maggruzin你不用普通的SQL。數組不可變。你創建一個新的數組。在程序化SQL(PL/PgSQL)中,我認爲你可以用':='來分配它......但我不確定。嘗試一下。 –