2012-03-20 21 views
28

Estoy escribiendo un script plpgsql.
Quiero obtener los contenidos de la matriz uno por uno desde una matriz de dos dimensiones.Postgres - array para el ciclo

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

Pero el código anterior devuelve

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

en una línea. Quiero ser capaz de reproducir indefinidamente y llamar a otra función que toma parámetros como:

another_func(key1,val1) 

Respuesta

79

Desde PostgreSQL 9.1 no es el 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$ 

Solución para versiones anteriores:

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$ 

Además, no hay diferencia entre varchar[] y varchar[][] para el sistema de tipo PostgreSQL. Explico con más detalle here.

La instrucción DO requiere al menos PostgreSQL 9.0, y LANGUAGE plpgsql es el valor predeterminado (por lo que puede omitir la declaración).

Cuestiones relacionadas