web-dev-qa-db-ja.com

plpgsqlでの配列次元のループ

Plpgsqlでは、2次元配列から配列の内容を1つずつ取得します。

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)
44
Harpreet

PostgreSQL9.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$

古いバージョンの解決策:

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$

また、PostgreSQLタイプシステムのvarchar[]varchar[][]の間に違いはありません。もっと詳しく説明します こちら

DOステートメントには少なくともPostgreSQL 9.0が必要であり、LANGUAGE plpgsqlがデフォルトです(したがって、宣言を省略できます)。

97