2011-04-01 50 views
1

我想在PL/pgSQL中創建二維數組。我已經找到像這樣的例子: myarray1 INT [2] [2]:= array [[NULL,NULL],[NULL,NULL]];PL/pgSQL中的動態多維數組

但在我的情況下,當我創建表時,我不知道該表的數組,因爲數據是從select查詢中讀取的。我如何聲明動態數組?


我以另一種方式問。 在Oracle我可以聲明:

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT 
(
    var1 VARCHAR(20), 
    ... 
) 
... 

這是記者於RECORD是plpsql。

然後在甲骨文,我可以宣佈

CREATE OR REPLACE TYPE MY_TYPE_MY_TYPES IS 
table of MY_TYPE; 

所以我可以存儲我的類型的類型選擇查詢,這僅僅是二維表的結果。而且我不必知道select查詢返回的行數。

我如何在plpsql中實現這一點?

感謝

回答

1

您不必指定數組的大小,當你declare them

myarray1 int[][]; 

但要注意,2維數組do not grow like 1-dimensional arrays

create or replace function testfunc() returns void language plpgsql as $$ 
declare 
    myarray1 int[][]; 
begin 
    for i in 1..2 loop 
    for j in 1..2 loop 
     raise notice '% %', i, j; 
     myarray1[i][j] := 1; 
    end loop; 
    end loop; 
end$$; 
select testfunc(); 

NOTICE: 1 1 
NOTICE: 1 2 
ERROR: array subscript out of range 
CONTEXT: PL/pgSQL function "testfunc" line 7 at assignment 

但是你可以將另一個數組分配給此變量:

create or replace function testfunc() returns void language plpgsql as $$ 
declare 
    myarray1 int[][]; 
begin 
    myarray1 := array[[NULL,NULL],[NULL,NULL]]; 
    for i in 1..2 loop 
    for j in 1..2 loop 
     raise notice '% %', i, j; 
     myarray1[i][j] := 1; 
    end loop; 
    end loop; 
end$$; 
select testfunc(); 
NOTICE: 1 1 
NOTICE: 1 2 
NOTICE: 2 1 
NOTICE: 2 2 
+0

我以另一種方式問。 – albert 2011-04-03 07:47:58

0

我回答以另一種方式:)

create view v as 
select * 
from (values (1, 'Adam'), (2, 'Bob'), (3, 'Chris')) as foo(id, forename); 

create or replace function f() returns text language plpgsql as $$ 
declare 
    myarray1 v[]; 
begin 
    select array_agg(row(id, forename)) from v into myarray1; 
    return myarray1::text; 
end$$; 

select f(); 

       f 
------------------------------------ 
{"(1,Adam)","(2,Bob)","(3,Chris)"} 
(1 row) 
0
PostgreSQL中

,所有類型 - 包括用戶定義的全1具有各自的數組類型。

所以如果你聲明一個複合類型,你也會有一個數組類型。你可以找到信息關於複合類型在這裏:https://www.postgresql.org/docs/current/static/rowtypes.html

這裏有一個例子:

1)創建一個新的複合型

CREATE TYPE "myType" AS ("id" INT, "name" VARCHAR); 

2)演示文稿陣列。結果的類型是 「的myType」[]

SELECT 
    ARRAY_AGG(v::"myType") AS v 
FROM 
    (VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')) AS v 

結果爲:{ 「(1,A)」, 「(2,B)」, 「(3,C)」,「(4 ,d)「}

3)unnesting 」的myType「[]數組和返回作爲記錄

SELECT (UNNEST('{"(1,a)","(2,b)","(3,c)","(4,d)"}'::"myType"[])).* 

結果是:

id | name 
---|----- 
1 | a 
2 | b 
3 | c 
4 | d