Цикл по размеру массива в plpgsql - PullRequest
42 голосов
/ 20 марта 2012

В 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 Ответ

95 голосов
/ 20 марта 2012

Начиная с 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 является значением по умолчанию (поэтому вы можете опустить объявление).

...