Emanuel Calvo Franco escribió:

> ubuntu$# begin
> ubuntu$#  for i in 1 .. tamano loop
> ubuntu$#    matriz := matriz || '{1,2}'::integer[];
> ubuntu$#    -- matriz[i] := 1;
> ubuntu$#    RAISE NOTICE 'matriz: %', matriz[i];
> ubuntu$#  end loop;

Pero matriz es un array bidimensional ... esto funciona:

CREATE OR REPLACE FUNCTION pepe(tamano integer) RETURNS integer AS $_$
declare
 matriz integer[] = '{{1,2}}';
 i integer;
begin
 for i in 1 .. tamano loop
   matriz := matriz || '{1,2}'::integer[];
   -- matriz[i] := 1;
   RAISE NOTICE 'matriz: % %', matriz[i][1], matriz[i][2];
 end loop;
 return matriz[1];
end;
$_$ LANGUAGE plpgsql;

O si quieres ver el elemento i-ésimo completo,

        RAISE NOTICE 'matriz: %', matriz[i:i][1:2];
(esto se llama un "slice" del array).

Si no sabes el tamaño de la segunda dimensión, puedes usar array_upper()
para pedirlo:
        RAISE NOTICE 'matriz: %', matriz[i:i][array_upper(matriz, 2)];

Observa que esto es equivalente a 
        RAISE NOTICE 'matriz: %', matriz[i:i][1:array_upper(matriz, 2)];

puesto que The Fine Manual dice 

        If any dimension is written as a slice, i.e. contains a colon,
        then all dimensions are treated as slices. Any dimension that
        has only a single number (no colon) is treated as being from 1
        to the number specified.

Normalmente los elementos empiezan de 1, pero puedes tener arreglos
raros que empiezan en otra subíndice, en cuyo caso lo que necesitas es
array_lower():
        RAISE NOTICE 'matriz: %', matriz[i:i][array_lower(matriz, 
2):array_upper(matriz, 2)];

Lo cual se puede probar si modificas el literal con que inicializas el
array:

CREATE OR REPLACE FUNCTION pepe(tamano integer) RETURNS integer AS $_$
declare
 matriz integer[] = '[1:1][-1:0]={{1,2}}';
 i integer;
begin
 for i in 1 .. tamano loop
   matriz := matriz || '[-1:0]={1,2}'::integer[];
   -- matriz[i] := 1;
   RAISE NOTICE 'matriz: %', matriz[i:i][array_lower(matriz, 
2):array_upper(matriz, 2)];
 end loop;
 raise notice 'matriz: %', matriz;
 return matriz[1];
end;
$_$ LANGUAGE plpgsql ;

alvherre=# select pepe(10);
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: {{1,2}}
NOTICE:  matriz: 
[1:11][-1:0]={{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2}}
 pepe 
------
     
(1 fila)

-- 
Alvaro Herrera                          Developer, http://www.PostgreSQL.org/
"Crear es tan difícil como ser libre" (Elsa Triolet)
--
TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
               http://archives.postgresql.org/pgsql-es-ayuda

Responder a