2012-04-18 9 views
22

Sto provando a eseguire il ciclo di un array intero (integer[]) in una funzione plpgsql. Qualcosa di simile a questo:Iterating over 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 

Nel mio caso applicativo concreto l'array intero a viene passato come parametro alla funzione. Ho ricevuto questo errore:

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

Come eseguire correttamente il loop della matrice?

risposta

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 

Oppure provare la new FOREACH in PostgreSQL 9.1:

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

soluzioni Tuttavia, basate su set con generate_series() o unnest() sono spesso più veloce di loop per i grandi gruppi.

Esempi di base:

ricerca Il tag o di più.

+0

in questo momento sto passando l'array alla funzione come 'f (array [1,2,3,4])' c'è un modo migliore per passare un array a una funzione? –

+3

'f ('{1,2,3,4}' :: int [])' è * un altro * modo. Meglio? - tu decidi! –