mira yo hice esta funcion
CREATE OR REPLACE FUNCTION cg_buscar_cargo(m_tipo integer, m_dato character
varying, m_codigo integer)
RETURNS SETOF cargo AS
$BODY$
DECLARE
fila cargo%rowtype;
sql character varying;
m character varying;
BEGIN
--1:BUSCAR TODOS LOS REGISTROS
IF m_tipo= 1 THEN
sql = 'SELECT * FROM cargo ORDER BY cg_cod';
END IF;
--2:BUSCAR REGISTROS DE ACUERDO AL NOMBRE O PARTE DE EL
IF m_tipo = 2 THEN
sql = 'SELECT * FROM cargo WHERE cg_nombre like ' ||
quote_literal($2) ;
END IF;
--3:BUSCAR REGISTROS DE ACUERDO AL CODIGO
IF m_tipo=3 THEN
sql = 'SELECT * FROM cargo WHERE cg_cod ='|| m_codigo;
END IF;
FOR fila IN EXECUTE sql
LOOP
RETURN NEXT fila;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
espero que te sirva de ejemplo
--
Cesar Erices Vergara
Ingeniero en Gestión Informática
Analista de Sistema
Santiago - Chile