在plpgsql中循环遍历数组维度

Har*_*eet 45 arrays postgresql for-loop plpgsql multidimensional-array

在plpgsql中,我想从二维数组中逐个获取数组内容.

DECLARE
  m varchar[];
  arr varchar[][] := array[['key1','val1'],['key2','val2']];
BEGIN
  for m in select arr
  LOOP
    raise NOTICE '%',m;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

但上面的代码返回:

{{key1,val1},{key2,val2}}
Run Code Online (Sandbox Code Playgroud)

在一条线上.我希望能够循环并调用另一个函数,该函数采用如下参数:

another_func(key1,val1)
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 99

从PostgreSQL 9.1开始就有了方便FOREACH:

DO
$do$
DECLARE
   m   varchar[];
   arr varchar[] := array[['key1','val1'],['key2','val2']];
BEGIN
   FOREACH m SLICE 1 IN ARRAY arr
   LOOP
      RAISE NOTICE 'another_func(%,%)',m[1], m[2];
   END LOOP;
END
$do$
Run Code Online (Sandbox Code Playgroud)

旧版本的解决方案:

DO
$do$
DECLARE
   arr varchar[] := '{{key1,val1},{key2,val2}}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
      RAISE NOTICE 'another_func(%,%)',arr[i][1], arr[i][2];
   END LOOP;
END
$do$
Run Code Online (Sandbox Code Playgroud)

此外,也没有什么区别varchar[],并varchar[][]为PostgreSQL的类型系统.我在这里详细解释一下.

DO语句至少需要PostgreSQL 9.0,并且LANGUAGE plpgsql是默认语句(因此您可以省略声明).