Estimados amigos tengo una funcion que saca el balance general horizontal en el 
modulo de contabilidad, y utilizo la siguiente funcion, quisiera ver si pueden 
darle un vistaso y conocer sus opiniones  a si se le puede mejorar.

CREATE OR REPLACE FUNCTION balanceMensual(vagecod character varying, vfeccorte 
date, todas integer,rc refcursor)
  RETURNS refcursor AS
$BODY$
DECLARE
    cSaldos refcursor;
    rBalMensual record;
    cuenta record;
    auxcuenta record;
    resultado refcursor;
    valormes numeric;
    tam integer;
BEGIN
    drop table BalMes;
    create temporary table BalMes(asicuecod varchar(20),cuenom 
varchar(50),enero numeric,febrero numeric,
        marzo numeric,abril numeric,mayo numeric,junio numeric,julio 
numeric,agosto numeric,septiembre numeric,
        octubre numeric,noviembre numeric,diciembre numeric,grupo character 
varying(1));
    --Todas=1 si queremos que revice todas las agencias
    if Todas=1 then
        open cSaldos for 
            select  extract(MONTH from asifec) as 
mes,asidet.asicuecod,sum(asidet.asideb) as asideb,sum(asidet.asihab) as 
asihab,sum(asidet.asideb-asidet.asihab) as asisaldo,cuegrutip as grupo
            FROM asicab,asidet,agencias,cuentagrupo
            WHERE     agencias.agecod=asicab.asiagecod
                and asicab.asiagecod=asidet.asiagecod 
                and asicab.asidoc=asidet.asidoc 
                and asicab.asinum=asidet.asinum 
                and cuentagrupo.cuegrucod=substring(asidet.asicuecod,1,1) 
                and asifec<=vFecCorte
            group by mes,asidet.asicuecod,cuegrutip
            ORDER BY mes,asicuecod;
    else
        open cSaldos for 
            select  extract(MONTH from asifec) as 
mes,asidet.asicuecod,sum(asidet.asideb) as asideb,sum(asidet.asihab) as 
asihab,sum(asidet.asideb-asidet.asihab) as asisaldo,cuegrutip as grupo
            FROM asicab,asidet,agencias,cuentagrupo
            WHERE     agencias.agecod=asicab.asiagecod
                and asicab.asiagecod=vagecod
                and asicab.asiagecod=asidet.asiagecod 
                and asicab.asidoc=asidet.asidoc 
                and asicab.asinum=asidet.asinum 
                and cuentagrupo.cuegrucod=substring(asidet.asicuecod,1,1) 
                and asifec<=vFecCorte
            group by mes,asidet.asicuecod,cuegrutip
            ORDER BY mes,asicuecod;
    end if;
    LOOP
        fetch cSaldos into rBalMensual;
        if rBalMensual is null then exit; end if;
        valormes:=rBalMensual.asideb-rBalMensual.asihab;
        if todas=1 then
            select cuecod,cuenom,cuecodant into cuenta from cuentas where 
cuecod=rBalMensual.asicuecod;
        else
            select cuecod,cuenom,cuecodant into cuenta from cuentas where 
cuecod=rBalMensual.asicuecod and cueagecod=vagecod;
        end if;
        
        if rBalMensual.mes=1 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||','||quote_literal(valormes)||',0,0,0,0,0,0,0,0,0,0,0,''A'')';
            else
                execute 'update balmes set 
'||quote_ident(enero)||'='||quote_literal(rBalMensual.asisaldo);
            end if;                
        end if;
        if rBalMensual.mes=2 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,'||quote_literal(valormes)||',0,0,0,0,0,0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
febrero='||quote_literal(auxcuenta.enero)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=3 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,'||quote_literal(valormes)||',0,0,0,0,0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
marzo='||quote_literal(auxcuenta.febrero)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=4 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,'||quote_literal(valormes)||',0,0,0,0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
abril='||quote_literal(auxcuenta.marzo)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;            
        if rBalMensual.mes=5 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,'||quote_literal(valormes)||',0,0,0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
mayo='||quote_literal(auxcuenta.abril)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=6 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,'||quote_literal(valormes)||',0,0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
junio='||quote_literal(auxcuenta.mayo)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=7 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,'||quote_literal(valormes)||',0,0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
julio='||quote_literal(auxcuenta.junio)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=8 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,0,'||quote_literal(valormes)||',0,0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
agosto='||quote_literal(auxcuenta.julio)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=9 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,0,0,'||quote_literal(valormes)||',0,0,0,''A'')';
            else
                execute 'Update BalMes SET 
septiembre='||quote_literal(auxcuenta.agosto)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=10 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,0,0,0,'||quote_literal(valormes)||',0,0,''A'')';
            else
                execute 'Update BalMes SET 
octubre='||quote_literal(auxcuenta.septiembre)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=11 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,0,0,0,0,'||quote_literal(valormes)||',0,''A'')';
            else
                execute 'Update BalMes SET 
noviembre='||quote_literal(auxcuenta.octubre)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
        if rBalMensual.mes=12 then
            select * into auxcuenta from BalMes where 
asicuecod=rBalMensual.asicuecod;
            if NOT FOUND then
                execute 'insert into BalMes 
values('||quote_literal(rBalMensual.asicuecod)||','||quote_literal(cuenta.cuenom)||',0,0,0,0,0,0,0,0,0,0,0,'||quote_literal(valormes)||',''A'')';
            else
                execute 'Update BalMes SET 
diciembre='||quote_literal(auxcuenta.noviembre)||','||quote_literal(cuenta.cuenom)||'::numeric+'||quote_literal(rBalMensual.asisaldo)||'::numeric
 where asicuecod='||quote_literal(rBalMensual.asicuecod);
            end if;                
        end if;
    END LOOP;
    --open resultado for select * from balmes order by asicuecod;
    --return resultado;
    open rc for select * from balmes order by asicuecod;
    return rc;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE

_________________________________________________________________
Color coding for safety: Windows Live Hotmail alerts you to suspicious email.
http://windowslive.com/Explore/Hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_safety_112008

Responder a