【问题标题】:PostgreSQL: ERROR: array subscript out of rangePostgreSQL:错误:数组下标超出范围
【发布时间】:2020-05-03 07:50:09
【问题描述】:

我正在尝试填充二维数组

do $$

declare pole text[][];

begin
for y in 1..6
loop
  for x in 1..4
  loop
    pole[y][x] = '0';
    raise notice 'x: %',x;
    raise notice 'y: %',y;
  end loop;
end loop;

/*
pole  := '{
{0,0,0,0}, 
{7,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
}';
*/

raise notice 'pole : %', pole;
raise notice 'pole one: %', pole[2][1];

end $$

但是得到ERROR: array subscript out of range,如果我像pole[6][4] := '0' 那样手动填充数组没有问题,但是一旦使用循环我就会出错,我不知道为什么,变量介于 1 和 4 以及 1 和 6 之间,并且手动分配有效。这是基本的编程我错过了什么吗?

1) SQL State: 00000 --- x: 1
2) SQL State: 00000 --- y: 1
3) SQL State: 00000 --- x: 2
4) SQL State: 00000 --- y: 1
5) SQL State: 00000 --- x: 3
6) SQL State: 00000 --- y: 1
7) SQL State: 00000 --- x: 4
8) SQL State: 00000 --- y: 1
9) SQL State: 00000 --- x: 1
10) SQL State: 00000 --- y: 2
11) SQL State: 00000 --- x: 2
12) SQL State: 00000 --- y: 2
13) SQL State: 00000 --- x: 3
14) SQL State: 00000 --- y: 2
15) SQL State: 00000 --- x: 4
16) SQL State: 00000 --- y: 2
17) SQL State: 00000 --- x: 1
18) SQL State: 00000 --- y: 3
19) SQL State: 00000 --- x: 2
20) SQL State: 00000 --- y: 3
21) SQL State: 00000 --- x: 3
22) SQL State: 00000 --- y: 3
23) SQL State: 00000 --- x: 4
24) SQL State: 00000 --- y: 3
25) SQL State: 00000 --- x: 1
26) SQL State: 00000 --- y: 4
27) SQL State: 00000 --- x: 2
28) SQL State: 00000 --- y: 4
29) SQL State: 00000 --- x: 3
30) SQL State: 00000 --- y: 4
31) SQL State: 00000 --- x: 4
32) SQL State: 00000 --- y: 4
33) SQL State: 00000 --- x: 1
34) SQL State: 00000 --- y: 5
35) SQL State: 00000 --- x: 2
36) SQL State: 00000 --- y: 5
37) SQL State: 00000 --- x: 3
38) SQL State: 00000 --- y: 5
39) SQL State: 00000 --- x: 4
40) SQL State: 00000 --- y: 5
41) SQL State: 00000 --- x: 1
42) SQL State: 00000 --- y: 6
43) SQL State: 00000 --- x: 2
44) SQL State: 00000 --- y: 6
45) SQL State: 00000 --- x: 3
46) SQL State: 00000 --- y: 6
47) SQL State: 00000 --- x: 4
48) SQL State: 00000 --- y: 6

x86_64-pc-linux-gnu 上的 PostgreSQL 11.6,由 gcc (GCC) 4.8.5 编译 20150623(红帽 4.8.5-39),64 位

【问题讨论】:

  • 你能试试for y in 1..array_length(pole,1) loop吗?
  • 是的,结果是“[代码:0,SQL 状态:22004] 错误:FOR 循环的上限不能为空 Kde:PL/pgSQL 函数 inline_code_block 在 FOR 的第 6 行,带有整数循环变量”

标签: arrays postgresql loops


【解决方案1】:

多维数组cannot grow类似于一维数组

存储的数组值可以通过分配给未指定的元素来扩大 已经存在。以前在场的人之间的任何职位和 新分配的元素将用空值填充。例如,如果 array myarray 当前有 4 个元素,它将有 6 个元素 在分配给 myarray[6] 的更新之后; myarray[5] 将包含 空值。 目前只允许以这种方式放大 一维数组,而不是多维数组。

所以你必须先初始化数组,然后填充它。

do $$

declare pole text[][];

begin

pole := array_fill(null::text, array[6,4]);

for y in 1..6
loop
  for x in 1..4
  loop

    raise notice 'x: %',x;
    raise notice 'y: %',y;
    pole[y][x] = '0';
  end loop;
end loop;


raise notice 'pole : %', pole;
raise notice 'pole one: %', pole[2][1];

end $$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多