2012-03-20 15 views
28

Piszę skrypt plpgsql.
Chcę uzyskać zawartość tablicy jeden po drugim z tablicy dwuwymiarowej.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; 

Ale powyższy kod zwraca

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

w jednej linii. Chcę móc pętli nad i wywołać inną funkcję, która pobiera parametry jak:

another_func(key1,val1) 

Odpowiedz

79

Ponieważ PostgreSQL 9,1 tam jest wygodny 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$ 

rozwiązanie dla starszych wersjach:

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$ 

Ponadto nie ma różnicy między varchar[] i varchar[][] dla systemu typu PostgreSQL. Wyjaśnię bardziej szczegółowo: here.

Instrukcja DO wymaga co najmniej PostgreSQL 9.0, a LANGUAGE plpgsql jest ustawieniem domyślnym (można pominąć deklarację).