From: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
---|---|
To: | Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com> |
Cc: | Conxita Marín <cmarin(at)dims(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Como utilizar un array dinámico en función plpgsql |
Date: | 2009-04-02 14:12:40 |
Message-ID: | 20090402141240.GE3163@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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)
From | Date | Subject | |
---|---|---|---|
Next Message | inf200468 | 2009-04-02 15:46:13 | [Fwd: consulta grande] |
Previous Message | Alvaro Herrera | 2009-04-02 13:43:55 | Re: consulta demasiado grande |