Re: VISTAS - Usar condición variable - SOLUCION

From: sergio carrasco <a882sacl(at)yahoo(dot)com(dot)ar>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: VISTAS - Usar condición variable - SOLUCION
Date: 2007-08-12 22:01:49
Message-ID: 821471.12836.qm@web36814.mail.mud.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


> > --- Jaime Casanova <systemguards(at)gmail(dot)com>
> escribió:
> >
> > > usa una funcion SQL

> > --- Gabriel Hermes Colina Zambra
> > <hermeszambra(at)yahoo(dot)com> escribió:
> > > Usa funciones sql con parametros que llamen a
> las
> > > vistas
> > > select * from vistas where id_medida=$1 and
> > > fecha<=$2
> > > and descripcion like '&$3&'
> > > y lo que te guste.


> a partir de la versión 8.1 puedes usar parámetros de
> salida
>
http://www.postgresql.org/docs/8.1/static/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS
>
> --
> Atentamente,
> Jaime Casanova

¡ GRACIAS Jaime y a TODOS !

Estuve buscando y encontré un post de Raul Caso que
terminó por decantar lo que buscaba. Publico la
solución por si a alguien más le pueda servir:

PROBLEMA: Almacenar una consulta compleja
(JOIN,subSELECTs,UNIONes,etc) en el servidor con paso
de parámetros. Me tenía que devolver un SET de
registros. La idea era descongestionar la aplicación
cliente de código y proceso, además usar parámetros
certeros (como un rango de fechas) para acotar las
consultas.

SOLUCION:

a) Debo definir un tipo de dato con los campos que me
va a retornar la función. No es crítica su definición,
pero se evitan su mención al llamarla:

CREATE TYPE a1 AS
(grupo integer,
descripcion character varying(40),
prestacion integer,
valor integer);

b) LA FUNCION

CREATE OR REPLACE FUNCTION base_a1(date,date)
RETURNS SETOF a1 AS
'
DECLARE
r a1%rowtype;
BEGIN
FOR r IN
(
SELECT (d03_ncod_prest/1000) as grupo,
m15_cdescripcion as descripcion,
count(d03_ingreso_prestaciones.ctid)::integer as
prestacion,
sum(d03_nvalor)::integer as valor
FROM m15_grupo_prestaciones,
d03_ingreso_prestaciones LEFT JOIN
d04_ingreso_pacientes ON (d03_nfolio_ing_pac_sk =
d04_nfolio_ing_pac_pk)
WHERE d04_dfecha_hora_atencion::date BETWEEN $1
AND $2 AND
d03_lactivo AND d04_lactivo AND
((m15_ngrupo_cpk*100)+m15_nsubgrupo_cpk) =
(d03_ncod_prest/1000)
GROUP BY m15_cdescripcion,(d03_ncod_prest/1000)
ORDER BY (d03_ncod_prest/1000)
) LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
'LANGUAGE 'plpgsql';

c) La llamada:

SELECT * FROM base_a1('2007-08-01','2007-08-01');

Espero le sirva a alguien ;)
Probada en Postgresql 8.1.9, Debian Etch.

Atte.

Sergio A. Carrasco L.

____________________________________________________________________________________
¡Sé un mejor ambientalista!
Encontrá consejos para cuidar el lugar donde vivimos.
http://ar.yahoo.com/promos/mejorambientalista.html

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Calabaza Calabaza 2007-08-13 11:20:47 Re: Como insertar registros
Previous Message Jaime Casanova 2007-08-12 17:05:33 Re: VISTAS - Usar condición variable