PL/pgSQL中的动态多维数组

PL/pgSQL中的动态多维数组,sql,postgresql,multidimensional-array,Sql,Postgresql,Multidimensional Array,我想在PL/pgSQL中创建二维数组 我发现这样的例子: myarray1 INT[2][2]:=数组[[NULL,NULL],[NULL,NULL]] 但在我的例子中,我在创建表时不知道表的数组,因为数据是从select查询读取的。如何声明动态数组 我用另一种方式问。 在Oracle中,我可以声明: CREATE OR REPLACE TYPE MY_TYPE AS OBJECT ( var1 VARCHAR(20), ... ) ... 这是对应于记录是plpsql 然后在Ora

我想在PL/pgSQL中创建二维数组

我发现这样的例子: myarray1 INT[2][2]:=数组[[NULL,NULL],[NULL,NULL]]

但在我的例子中,我在创建表时不知道表的数组,因为数据是从select查询读取的。如何声明动态数组


我用另一种方式问。 在Oracle中,我可以声明:

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT
(
  var1 VARCHAR(20),
  ...
)
...
这是对应于记录是plpsql

然后在Oracle中我可以声明

CREATE OR REPLACE TYPE MY_TYPE_MY_TYPES IS
table of MY_TYPE;
因此,我可以将select查询的结果存储在类型中,即二维表。我不必知道select查询返回的行数

如何在plpsql中实现这一点


谢谢

当您执行以下操作时,无需指定阵列的大小:

但请注意,二维数组:

但是,您可以将另一个数组分配给此变量:

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
我用另一种方式回答:)


在PostgreSQL中,所有类型(包括用户定义的类型)都有各自的数组类型

因此,如果您声明一个复合类型,那么您也将拥有一个数组类型。您可以在此处找到有关复合类型的信息:

下面是一个例子:

1) 创建新的复合类型

CREATE TYPE "myType" AS ( "id" INT, "name" VARCHAR );
2) 演示阵列演示。结果的类型为“myType”[]

结果是:{“(1,a)”,“(2,b)”,“(3,c)”,“(4,d)”}

3) 正在取消“myType”[]数组的测试并作为记录返回

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

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)
CREATE TYPE "myType" AS ( "id" INT, "name" VARCHAR );
SELECT
    ARRAY_AGG( v::"myType" ) AS v
FROM
    ( VALUES ( 1, 'a' ), ( 2, 'b' ), ( 3, 'c' ), ( 4, 'd' ) ) AS v
SELECT ( UNNEST( '{"(1,a)","(2,b)","(3,c)","(4,d)"}'::"myType"[] ) ).*
id | name
---|-----
 1 | a
 2 | b
 3 | c
 4 | d