2012-03-20 17 views
28

Sto scrivendo uno script plpgsql.
Voglio ottenere i contenuti dell'array uno per uno da una matrice a due dimensioni.Postgres - array for loop

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

Ma il codice precedente restituisce

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

in una sola riga. Voglio essere in grado di eseguire un loop e chiamare un'altra funzione che prende parametri come:

another_func(key1,val1) 

risposta

79

Dal PostgreSQL 9.1 c'è la comoda 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$ 

Soluzione per vecchie versioni:

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$ 

Inoltre, non c'è differenza tra varchar[] e varchar[][] per il sistema di tipi PostgreSQL. Spiego in maggior dettaglio here.

L'istruzione DO richiede almeno PostgreSQL 9.0 e LANGUAGE plpgsql è l'impostazione predefinita (quindi è possibile omettere la dichiarazione).