Re: [pgsql-es-ayuda] Como utilizar un array dinámico en función plpgsql

From: Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Conxita Marín <cmarin(at)dims(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Como utilizar un array dinámico en función plpgsql
Date: 2009-04-03 12:50:58
Message-ID: f205bb120904030550v23224336q179400f0a90b6b45@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 2 de abril de 2009 11:12, Alvaro Herrera
<alvherre(at)alvh(dot)no-ip(dot)org> escribió:
> 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)
>

Genial explicación Alvaro!
Gracias!

--
Emanuel Calvo Franco
Sumate al ARPUG !
(www.postgres-arg.org -
www.arpug.com.ar)
ArPUG / AOSUG Member
Postgresql Support & Admin

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Laura Martinelli 2009-04-03 13:17:56 Permisos de usuario
Previous Message Emanuel Calvo Franco 2009-04-03 12:45:49 Re: Conexiones externas a pgbouncer