在 plpgsql 中循环数组维度

68

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

DECLARE
  m varchar[];
  arr varchar[][] := array[['key1','val1'],['key2','val2']];
BEGIN
  for m in select arr
  LOOP
    raise NOTICE '%',m;
  END LOOP;
END;

但是上述代码返回:

{{key1,val1},{key2,val2}}

一行代码中,我希望能够循环调用另一个需要参数的函数,例如:

another_func(key1,val1)
1个回答

147

自PostgreSQL 9.1以来

有方便的FOREACH可以循环遍历数组的切片手册:

目标变量必须是一个数组,并且接收数组值的连续切片,其中每个切片的维数由SLICE指定。

DO
$do$
DECLARE
   m   text[];
   arr text[] := '{{key1,val1},{key2,val2}}';  -- array literal
BEGIN
   FOREACH m SLICE 1 IN ARRAY arr
   LOOP
      RAISE NOTICE 'another_func(%,%)', m[1], m[2];
   END LOOP;
END
$do$;

db<>fiddle here - 使用打印结果的函数替代DO

LANGUAGE plpgsqlDO语句的默认值,因此我们可以省略声明。

对于Postgres类型系统,text[]text[][]之间没有区别。请参见:

Postgres 9.0或更早版本

DO
$do$
DECLARE
   arr text[] := array[['key1','val1'],['key2','val2']];  -- array constructor
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$;

我们如何动态运行它,例如如果我们有一个包含n个项目的数组arr,我们需要为每个项目提高n次通知。 - Cherryl Rarewings
@CherrylRarewings:我建议您提出一个新问题并说明您的具体情况。您可以随时链接到这个问题以便更好地理解背景。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接