Ayuda para optimizar una funcion.

From: Fernandos Siguenza <fsigu(at)hotmail(dot)com>
To: Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Ayuda para optimizar una funcion.
Date: 2009-03-13 16:42:36
Message-ID: COL111-W22C450A810F78647DC807CA19C0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2009-03-13 16:50:09 Re: Cache de escritura
Previous Message Mariano Reingart 2009-03-13 16:26:39 Re: F1