RE: Recorrer un Refcursor

From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: fernando(dot)fontana(at)gmail(dot)com, Fernando Siguenza <fsigu(at)hotmail(dot)com>
Cc: Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Recorrer un Refcursor
Date: 2008-11-26 14:47:09
Message-ID: 94445.74964.qm@web63704.mail.re1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

--- El mié 26-nov-08, Fernando Siguenza <fsigu(at)hotmail(dot)com> escribió:

> De: Fernando Siguenza <fsigu(at)hotmail(dot)com>
> Asunto: RE: [pgsql-es-ayuda] Recorrer un Refcursor
> A: fernando(dot)fontana(at)gmail(dot)com
> Cc: "Foro Postgres" <pgsql-es-ayuda(at)postgresql(dot)org>
> Fecha: miércoles, 26 noviembre, 2008, 10:54 am
> No el update
> CURRENT OF cursor_name,
> Lo que hace es actualizar una tabla y yo lo que necesito es
>
> actualizar los datos que tengo en un cursor, esto es lo
> que necesito a ver si me ayudan de pronto a encontrar otra
> solucion,
>
> Tengo una tabla de asientos donde ago el siguiente select,
>
> open rfcursor for
> select asidoc,' ' as
> documento,asinum,asidebe,asihaber,0.00 as saldo from
> asientos
> algo asi
> CD,'',1,10,0,0.0
> CD,'',2,15,0,0.0
> CD,'',3,0,3,0.0
> FA,'',1,17,0,0.0
>
> ahora este resultado me retona la columna documento en
> blanco y la columna saldo todo en cero,
> entonces quiero recorrer este cursor para hacer el select
> del nombre del documento que esta en otra tabla y ponerlo en
> el cursor y a la columna del saldo poner la resta del debe -
> haber. Necesitando tener algo asi
>
> CD,'COMPROBANTE DIARIO',1,10,0,10.0
>
> CD,'COMPROBANTE DIARIO',2,15,0,15.0
>
> CD,'COMPROBANTE DIARIO',3,0,3,-3.0
>
> FA,'FACTURA VENTA',1,17,0,17.0
>
> Y finalmente retornar este cursor
> Entonces como digo necesito es poder recorrer el cursor y
> actualizar los datos del mismo, o hay alguna otra forma de
> hacer esto con cursores????
> Gracias de antemano
>
> Date: Tue, 25 Nov 2008 23:23:23 -0200
> From: fernando(dot)fontana(at)gmail(dot)com
> To: fsigu(at)hotmail(dot)com
> Subject: Re: [pgsql-es-ayuda] Recorrer un Refcursor
> CC: pgsql-es-ayuda(at)postgresql(dot)org
>
> Hola,
> creo que lo que estás buscando es el "update ...
> where current of nombrecursor". fijate en
> http://www.postgresql.org/docs/8.3/static/sql-update.html
>
>
> saludos
>
> El 25 de noviembre de 2008 21:33, Fernando Siguenza
> <fsigu(at)hotmail(dot)com> escribió:
>
>
>
>
>
>
> Si lo lei pero no me dice nada de como actualizar un campo
> de un registro del cursor, estoy buscando parec ser algo
> como
>
>
>
> select
> asicab.asiagecod,asicab.asifec,asicab.asidoc,asicab.asinum,0.00000
> as saldo
> from asicab for update
>
>
>
> o algo asi
>
> lyego con una sentencia update actualizo los datos del
> cursor, pero todavia no doy con la respuesta
>
>
>
> Gracias por responder
>
> > Date: Tue, 25 Nov 2008 21:13:48 -0200
> > From: agustingenoves(at)gmail(dot)com
> > To: fsigu(at)hotmail(dot)com
>
> > Subject: Re: [pgsql-es-ayuda] Recorrer un Refcursor
> > CC: pgsql-es-ayuda(at)postgresql(dot)org
> >
> > Creo que aca esta todo lo que necesitas, no se si lo
> viste
>
> >
> http://www.postgresql.org/docs/8.3/static/plpgsql-cursors.html
> >
> > 2008/11/25 Fernando Siguenza
> <fsigu(at)hotmail(dot)com>:
>
> > > Amigos como estan, sigo molestandoles con
> preguntitas, necesito que me
> > > ayuden con un problemita,
> > >
> > > como hago para recorrer y manipular un refcursor,
> tengo algo como esto
> > >
>
> > > CREATE OR REPLACE FUNCTION prueba(agencia
> varchar) RETURNS refcursor AS $$
> > > DECLARE
> > > cMayor refcursor;
> > >
> > > BEGIN
> > > open cMayor for
> > > select
>
> > >
> asicab.asiagecod,asicab.asifec,asicab.asidoc,asicab.asinum,0.00000
> as saldo
> > > from asicab;
> > > aqui como hago para recorrer el refcursor y
> cambiar el valor de la
> > > columna saldo por algun valor
>
> > > RETURN NEXT cMayor;
> > > END;
> > > $$
> > > LANGUAGE 'plpgsql';
> > >
> > > Gracias
> > >
> > > ________________________________
> > > See how Windows(R) connects the people,
> information, and fun that are part of
>
> > > your life
>
>
> Get 5 GB of storage with Windows Live Hotmail. Sign up
> today.
>
>
>
> _________________________________________________________________
> Windows Live Hotmail now works up to 70% faster.
> http://windowslive.com/Explore/Hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_faster_112008

Mira no es tan dificil
Igualmente yo solucione con otro metodo, incluso podes usar una tabla temporal y no auxiliar como yo y el rendimiento es buenisimo

formula numero 1

CREATE OR REPLACE FUNCTION "deudores"."fnc_inserto_estado" (date, integer, date) RETURNS date AS
$body$
declare
v_desde alias for $1;
v_id_empresa alias for $2;
v_hasta alias for $3;
curtime date;
nsaldo double precision;
nmoneda integer;
nempresa integer;
restados RECORD;
rmonedas RECORD;
rempresas RECORD;
rsaldo_ant RECORD;
BEGIN
curtime :='now';
nsaldo :=0;
nmoneda :=0;
nempresa := 0;
delete from deudores.estado_deudores;
if $2 <> 0 then
insert into deudores.estado_deudores
(id_moneda,id_corr,id_empresa,empresa,categoria_empresa,
id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
select central.cestados_deudores.id_moneda,0 as id_corr,central.cestados_deudores.id_empresa,
empresa,categoria_empresa,0 as id_documentos,
'Saldo anterior al ' || $1 as documento,'S' as serie,
0 as numero,$1 as fecha,sum(debe) as debe,sum(haber) as haber,sum(debe)+sum(haber) as saldo from central.cestados_deudores
where fecha<$1 and id_empresa=$2
group by central.cestados_deudores.id_moneda,central.cestados_deudores.id_empresa,
empresa,categoria_empresa;
else
insert into deudores.estado_deudores
(id_moneda,id_corr,id_empresa,empresa,categoria_empresa,
id_documentos,documento,serie,numero,fecha,debe,haber,saldo)
select central.cestados_deudores.id_moneda,0 as id_corr,central.cestados_deudores.id_empresa,
empresa,categoria_empresa,0 as id_documentos,
'Saldo anterior al ' || $1 as documento,'S' as serie,
0 as numero,$1 as fecha,sum(debe) as debe,sum(haber) as haber,sum(debe)+sum(haber) as saldo from central.cestados_deudores
where fecha<$1
group by central.cestados_deudores.id_moneda,central.cestados_deudores.id_empresa,
empresa,categoria_empresa;
end if;

if $2 <> 0 then
for rmonedas IN select id_moneda from central.cestados_deudores where id_empresa=$2 group by id_moneda loop
select saldo INTO rsaldo_ant from deudores.estado_deudores where id_moneda=rmonedas.id_moneda and id_empresa=$2 and numero=0;
nsaldo:=coalesce(rsaldo_ant.saldo,0);
for restados in select id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber
from central.cestados_deudores where fecha>=$1 and id_empresa=$2 and fecha<=$3
and id_moneda=rmonedas.id_moneda order by id_moneda,id_empresa,fecha,id_corr
loop
nsaldo:=coalesce(nsaldo,0)+coalesce(restados.debe,0)+coalesce(restados.haber,0);
insert into deudores.estado_deudores
(id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber,saldo)
values(restados.id_moneda,restados.cotizacion,restados.id_corr,
restados.id_empresa,restados.empresa,restados.categoria_empresa,restados.id_documentos
,restados.documento,restados.serie,restados.numero,restados.fecha,restados.debe,restados.haber,
nsaldo);
end loop;
end loop;
else
for restados in select id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber
from central.cestados_deudores where fecha>=$1 and fecha<=$3
order by id_moneda,id_empresa,fecha,id_corr
loop
if nempresa<>restados.id_empresa or nmoneda<>restados.id_moneda then
select saldo INTO rsaldo_ant from deudores.estado_deudores where id_moneda=restados.id_moneda and id_empresa=restados.id_empresa and numero=0;
nsaldo:=coalesce(rsaldo_ant.saldo,0);
nempresa:=restados.id_empresa;
nmoneda:=restados.id_moneda;
end if;
nsaldo:=coalesce(nsaldo,0)+coalesce(restados.debe,0)+coalesce(restados.haber,0);
insert into deudores.estado_deudores
(id_moneda,cotizacion,id_corr,
id_empresa,empresa,categoria_empresa,id_documentos
,documento,serie,numero,fecha,debe,haber,saldo)
values(restados.id_moneda,restados.cotizacion,restados.id_corr,
restados.id_empresa,restados.empresa,restados.categoria_empresa,restados.id_documentos
,restados.documento,restados.serie,restados.numero,restados.fecha,restados.debe,restados.haber,
nsaldo);
end loop;
end if;
delete from deudores.estado_deudores where fecha>$3;
UPDATE deudores.estado_deudores set debe=0,haber=0 where numero=0 and serie='S';
RETURN curtime;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Bueno espero te sirva, incluso para acreedores probe recientemente otra forma que fue mas rapida aun por que no abuso de los insert.

Un abrazo

¡Todo sobre la Liga Mexicana de fútbol! Estadisticas, resultados, calendario, fotos y más:&lt;
http://espanol.sports.yahoo.com/

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-11-26 14:53:36 Re: Recorrer un Refcursor
Previous Message Fernando Siguenza 2008-11-26 14:44:40 RE: Recorrer un Refcursor