web-dev-qa-db-fra.com

Itération sur un entier [] dans PL / pgSQL

J'essaie de parcourir un tableau entier (integer[]) dans une fonction plpgsql. Quelque chose comme ça:

declare
    a integer[] = array[1,2,3];
    i bigint;
begin
    for i in a
loop 
    raise notice "% ",i;
end loop;
return true;
end

Dans mon cas d'utilisation réel, le tableau d'entiers a est passé en paramètre à la fonction. Je reçois cette erreur:

ERROR:  syntax error at or near "$1"
LINE 1:   $1

Comment parcourir correctement le tableau?

39
Dipro Sen
DECLARE
   a integer[] := array[1,2,3];
   i integer;                   -- int, not bigint!
BEGIN
FOR i IN 1 .. array_upper(a, 1)
LOOP
   RAISE NOTICE '%', a[i];      -- single quotes!
END LOOP;
RETURN TRUE;
END

Ou essayez le nouveau FOREACH dans PostgreSQL 9.1 :

FOREACH i IN ARRAY a
LOOP 
   RAISE NOTICE '%', i;
END LOOP;

Cependant, les solutions basées sur des ensembles avec generate_series() ou unnest() sont souvent plus rapides que le bouclage pour les grands ensembles.

Exemples de base:

Recherchez les balises generate-series ou nnest pour en savoir plus.

80
Erwin Brandstetter