2012-04-18 3 views
22

Ich versuche, ein Integer-Array (integer[]) in einer Plpgsql-Funktion durchlaufen. Etwas wie folgt aus:Iterieren über Integer [] in PL/pgSQL

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

In meinem konkreten Anwendungsfall die Integer-Array a wird als Parameter an die Funktion übergeben. Ich erhalte diesen Fehler:

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

Wie man das Array richtig durchlaufen?

Antwort

50
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 

Oder versuchen die new FOREACH in PostgreSQL 9.1:

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

jedoch Set-basierte Lösungen mit generate_series() oder unnest() sind oft schneller als für große Mengen Looping.

Grund Beispiele:

Suche die Tags oder für mehr.

+0

gerade übergebe ich das Array an die Funktion als 'f (Array [1,2,3,4])' Gibt es einen besseren Weg, ein Array an eine Funktion zu übergeben? –

+3

'f ('{1,2,3,4}' int [])' ist * ein anderer * Weg. Besser? - du entscheidest! –