web-dev-qa-db-fra.com

Boucle sur la dimension du tableau dans plpgsql

Dans plpgsql, je veux obtenir le contenu du tableau un par un à partir d'un tableau à deux dimensions.

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

Mais le code ci-dessus renvoie:

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

dans une ligne. Je veux pouvoir faire une boucle et appeler une autre fonction qui prend des paramètres comme:

another_func(key1,val1)
44
Harpreet

Depuis PostgreSQL 9.1 il y a la commodité 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$

Solution pour les versions antérieures :

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$

De plus, il n'y a pas de différence entre varchar[] et varchar[][] pour le système de type PostgreSQL. J'explique plus en détail ici .

L'instruction DO nécessite au moins PostgreSQL 9.0 et LANGUAGE plpgsql est la valeur par défaut (vous pouvez donc omettre la déclaration).

97
Erwin Brandstetter