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
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 |