我想在PL / pgSQL中创建二维数组。
我找到了这样的例子: myarray1 INT [2] [2]:= array [[NULL,NULL],[NULL,NULL]];
但在我的情况下,我在创建表时不知道表的数组,因为数据是从select查询中读取的。我如何声明动态数组?
CREATE OR REPLACE TYPE MY_TYPE AS OBJECT
(
var1 VARCHAR(20),
...
)
...
这对应于RECORD是plpsql。
然后在Oracle中我可以声明
CREATE OR REPLACE TYPE MY_TYPE_MY_TYPES IS
table of MY_TYPE;
所以我可以将select查询的结果存储在只是二维表的类型类型中。而且我不必知道select查询返回的行数。
我怎样才能在plpsql中实现这个目标?
由于
答案 0 :(得分:1)
myarray1 int[][];
但请注意二维数组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
答案 1 :(得分: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)
答案 2 :(得分:0)
因此,如果您声明一个复合类型,那么您也将拥有一个数组类型。您可以在此处找到有关复合类型的信息: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)",& #34;(4,d)"}
3)取消" myType" []数组并返回记录
SELECT ( UNNEST( '{"(1,a)","(2,b)","(3,c)","(4,d)"}'::"myType"[] ) ).*
结果是:
id | name
---|-----
1 | a
2 | b
3 | c
4 | d