Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] 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: Miguel Angel <mvillagomez(at)sayab(dot)com(dot)mx>
Cc: Conxita Marín <cmarin(at)dims(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como utilizar un array dinámico en función plpgsql
Date: 2009-04-01 17:55:03
Message-ID: f205bb120904011055s8965b09ta72fa730fcaba1d6@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 1 de abril de 2009 14:37, Miguel Angel
<mvillagomez(at)sayab(dot)com(dot)mx> escribió:
> El mié, 01-04-2009 a las 19:08 +0200, Conxita Marín escribió:
>> Gracias por tu solución, el problema és que el código del resto de la
>> función es bastante complejo y ya està escrito en plpgsql.
>> Esperaré  aun poco a ver si alguien me da otra solución simple en plpgsql,
>> sino tiraré de tablas temporales para implementar el vector.
>
> Algo más feo pero supongo que podrías considerar esto:
>
> CREATE OR REPLACE FUNCTION pepe_master (integer) RETURNS VOID AS $BODY$
> DECLARE
>  nombre_funcion VARCHAR:= 'pepe_child';
>  notificacion VARCHAR:= $$RAISE NOTICE 'Elemento:%
> (%)',elemento,array[elemento];$$;
>  funcion VARCHAR:=
>                  '
>                  CREATE OR REPLACE FUNCTION ' || nombre_funcion || ' ()
> RETURNS VOID AS $$
>                  DECLARE
>                   array INTEGER[' || $1 || '];
>                   elemento INTEGER;
>                  BEGIN
>                   FOR elemento IN 1..' || $1 || ' LOOP
>                     array[elemento]:=elemento;
>                     ' || notificacion || '
>                   END LOOP;
>                  END;
>                  $$ LANGUAGE PLPGSQL;
>                 ';
>  garbage VARCHAR;
> BEGIN
>  EXECUTE funcion;
>  EXECUTE 'SELECT ' || nombre_funcion || '()';
> END;
> $BODY$ LANGUAGE PLPGSQL;
> SELECT pepe_master(10);
>
>

Aca declaras una matriz de una sola dimension, calculo que
modificando un poco de codigo obtendrías un array multidimensional
variable.
Sin embargo si es una matriz unidimensional dinamica la siguiente
funcion anda:

CREATE OR REPLACE FUNCTION pepe(integer) RETURNS integer AS $_$
DECLARE
tamano alias for $1;
matriz integer[][]; -- no me equivoque
i integer ;
BEGIN
for i in 1..tamano loop
matriz[i] := 1;
RAISE NOTICE 'number: %', matriz[i];
end loop;

return i;
END;
$_$ LANGUAGE plpgsql;

Sin embargo, si modificamos el RAISE y ponemos
matriz[i][0] devuelve NULL (eso tiene sentido), pero
cuando le queremos asignar valor a esa variable, tira
el error de out of range (!)

> De hecho la otra solución que te dieron se me hizo mejor, pero bueno
> aquí solo se aportan ideas.
>
>

--
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 inf200468 2009-04-01 18:00:52 consulta demasiado grande
Previous Message Carlos Bazán 2009-04-01 17:47:47 Re: Como utilizar un array dinámico en función plpgsql