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)
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).