Подтвердить что ты не робот

Postgres - массив для цикла

Я пишу plpgsql script.
Я хочу получить содержимое массива один за другим из массива с двумя измерениями.

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)
4b9b3361

Ответ 1

Так как 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$

Решение для старых версий:

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$

Кроме того, нет разницы между varchar[] и varchar[][] для системы типа PostgreSQL. Я объясняю подробнее здесь.

Оператор DO требует, по крайней мере, PostgreSQL 9.0, а LANGUAGE plpgsql является значением по умолчанию (поэтому вы можете опустить объявление).