Loop over array dimension em plpgsql

Em plpgsql, quero obter o conteúdo da matriz, um por um, a partir de uma matriz de duas dimensões.

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

Mas o código acima retorna:

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

em uma linha. Eu quero ser capaz de fazer um loop e chamar outra function que leva parâmetros como:

 another_func(key1,val1) 

Desde o PostgreSQL 9.1 existe a conveniente 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$ 

Solução para versões mais antigas :

 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$ 

Além disso, não há diferença entre varchar[] e varchar[][] para o sistema de tipos PostgreSQL. Eu explico com mais detalhes aqui .

A instrução DO requer pelo menos o PostgreSQL 9.0 e LANGUAGE plpgsql é o padrão (assim você pode omitir a declaração).