Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

LIMIT en función plpgsql

Estas en el tema de LIMIT en función plpgsql en el foro de PostgreSQL en Foros del Web. Estimad@s, He estado trabajando bastante con postgre y funciones pgsql, el tema se me puso feo porque ahora necesito paginar los resultados y no tengo ...
  #1 (permalink)  
Antiguo 16/11/2009, 15:27
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 20 años, 4 meses
Puntos: 2
LIMIT en función plpgsql

Estimad@s,

He estado trabajando bastante con postgre y funciones pgsql, el tema se me puso feo porque ahora necesito paginar los resultados y no tengo idea cómo hacer para en la función generar la consulta de acuerdo a los parametros enviados.

Lo que quiero hacer es que si me pasan un valor para inicio y final entonces agrego esa parte a la consulta, sino ignoro eso. Hasta ahora mi función está más o menos así pero no sé cómo transformarla , si me pueden echar una mano estaré muy agradecido.

Código:
-- los parametros son un id, inicio (offset) y final (limit)
CREATE OR REPLACE FUNCTION funcionprueba(integer, integer, integer) RETURNS SETOF RECORD AS $$
DECLARE 
   id_area ALIAS FOR $1;
   inicio ALIAS FOR $2;
   fin ALIAS FOR $3;
   datos RECORD;
BEGIN
   FOR datos IN
      SELECT nombre, visitas
      FROM tabla
      WHERE id=id_area
   LOOP
      RETURN NEXT datos;
   END LOOP;
   RETURN;
END;
$$ LANGUAGE plpgsql VOLATILE;
Eso, muchas gracias de antemano.

Saludos

PD: ¿¿¿alguien me dice por favor cómo poner el código tipo SQL???
  #2 (permalink)  
Antiguo 16/11/2009, 17:14
Avatar de xdrtas  
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 16 años, 6 meses
Puntos: 13
Respuesta: LIMIT en función plpgsql

Hola rProgged, puedes usar un bloque IF para discernir si usar el LIMIT o no en la consulta, te pongo un ejemplo de tu código modificado:

Código:
CREATE OR REPLACE FUNCTION funcionprueba(integer, integer, integer) RETURNS SETOF RECORD AS $$
DECLARE 
   id_area ALIAS FOR $1;
   inicio ALIAS FOR $2;
   fin ALIAS FOR $3;
   datos RECORD;
BEGIN
	IF(inicio = null and fin = null) THEN
		FOR datos IN
			SELECT nombre, visitas
			FROM tabla
			WHERE id=id_area
		LOOP
			RETURN NEXT datos;
		END LOOP;
	ELSE
		FOR datos IN
			SELECT nombre, visitas
			FROM tabla
			WHERE id=id_area LIMIT inicio OFFSET final
		LOOP
			RETURN NEXT datos;
		END LOOP;
	END IF;
	   RETURN;
END;
$$ LANGUAGE plpgsql VOLATILE;
Para llamar la consulta sin el LIMIT lo haces así:
Código:
select * from funcionprueba(1,null,null) as (nombre varchar, visitas integer);
Para llamar a la consulta con el LIMIT:
Código:
select * from funcionprueba(1,10,0) as (nombre varchar, visitas integer);
Espero que te sirva.

Última edición por xdrtas; 16/11/2009 a las 17:16 Razón: Error en el código!
  #3 (permalink)  
Antiguo 16/11/2009, 20:24
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 20 años, 4 meses
Puntos: 2
Respuesta: LIMIT en función plpgsql

Una solución muy inteligente de verdad, muchas gracias, me sirve a la perfección

saludos
  #4 (permalink)  
Antiguo 16/11/2009, 21:46
Avatar de xdrtas  
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 16 años, 6 meses
Puntos: 13
Respuesta: LIMIT en función plpgsql

No hay problema, me alegro de que te sirva, saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:40.