2011-04-01 49 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