Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Archive for January, 2009

Escribiendo procedimientos almacenados en postgresql 8.3

-- Function: paginacion_pais(integer, integer)

-- DROP FUNCTION paginacion_pais(integer, integer);

CREATE OR REPLACE FUNCTION paginacion_pais(number_of_items integer, page_number integer)
  RETURNS SETOF pais AS
$BODY$

	DECLARE
		r pais%ROWTYPE;
		maximo int:= page_number * number_of_items;
		items int:=1;
		num_items int:=0;
		total_items int:=0;
		diferencia int:=0;
		minimo int:= maximo - number_of_items +1;
	BEGIN

	        EXECUTE 'select count(*) from pais' INTO total_items;
	        IF maximo > total_items THEN
	          diferencia = maximo - total_items;
	        END IF;
                IF diferencia < number_of_items THEN
		FOR r IN SELECT * FROM pais
		LOOP
			-- can do some processing here
			if items = minimo then
			IF minimo <= maximo THEN

			RETURN NEXT r; -- return current row of SELECT
                        minimo=minimo+1;
			END IF;
			end if;
			items=items+1;
		END LOOP;

		END IF;

	RETURN;
	END

$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;

Forma de uso:

select * from paginacion_pais(100,25 );