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

Responder a