From: "Felipe Amezquita" <felmarla(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject:
Date: 2006-03-16 19:30:51
Message-ID: bf4cfe570603161130m759e8a38x@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Que tal lista el asunto es el siguiente, resulta que dentro de una funcion
quiero ejecutar otra que retorna un cursor.
Yo se que para ejecutar funciones de postgres se igula una variable a la
funcion con sus parametros y esta queda almacenada alli
pero cuando es con cursores no se como hacerlo.Pense que igualando a una
variables de tipo refcursor con sus parametros y haciendo fecth de la
variable pero creo que no funciona
algo asi

CREATE OR REPLACE function asentar_cuota (in_prg_codigo
cuota.prg_codigo%type,in_cap_codigo cuota.cap_codigo%type,
in_cuo_codigo cuota.cuo_codigo%type,in_cuo_desc
cuota.cuo_descuento%type,in_cuo_valor_total
cuota.cuo_valor_total%type,
in_cuo_fecha_pago cuota.cuo_fecha_pago%type ,in_fac_prefijo
cuota.fac_prefijo%type,in_fac_numero cuota.fac_numero%type,in_cuo_estado
cuota.est_codigo%type,
in_fraccionar Varchar)
returns numeric
as'
declare
num_fracciones Numeric(3);
var_valor_cuota Numeric(8);
pagadoC Numeric(8);
var_fecha_ideal date;
var_fecha_vencim date;
var_fecha_vigen date;
var_valor_total numeric(8);
totalFraccion Numeric(8);
restriCod Numeric(3);
cantMora Numeric(3);
cursorProxPago refcursor;
fecIdeal date;
fecLimite date;

begin

cantMora := 0;

-- Se consulta el código de fracción de la fracción mayor de la cuota
indicada
select max(cuo_fraccion) INTO num_fracciones from cuota where
prg_codigo = in_prg_codigo and cap_codigo = in_cap_codigo
and cuo_codigo = in_cuo_codigo;

-- Se extrae la información de la cuota para la creacción de las
fracciones si es necesario
select cuo_valor_cuota, cuo_fecha_ideal_pago, cuo_fecha_vencim,
cuo_fecha_vigencia, cuo_valor_total
INTO var_valor_cuota, var_fecha_ideal, var_fecha_vencim,
var_fecha_vigen, var_valor_total from cuota
where prg_codigo = in_prg_codigo and cap_codigo = in_cap_codigo and
cuo_codigo = in_cuo_codigo and cuo_fraccion = 0;

-- Se verifica si se va a fraccionar el pago o se va a pagar completa la
cuota o a terminar de pagar
if (in_fraccionar = ''F'') then

-- Si la cuota a pagar no tiene fracciones se registra el pago de la
cuota en el sistema
if (num_fracciones = 0) then

update cuota
set cuo_descuento = in_cuo_desc,
cuo_valor_total = in_cuo_valor_total,
cuo_fecha_pago = in_cuo_fecha_pago,
cuo_fecha_ingreso =current_date,
est_codigo = ''Ca'',
fac_prefijo = in_fac_prefijo,
fac_numero = in_fac_numero
where prg_codigo = in_prg_codigo and cap_codigo =
in_cap_codigo and cuo_codigo = in_cuo_codigo;

-- Si la cuota ya tiene fracciones se crea la fracción con la que se
termina de pagar la cuota
else
select sum(cuo_valor_cuota) INTO totalFraccion from cuota where
prg_codigo = in_prg_codigo and cap_codigo = in_cap_codigo
and cuo_codigo = in_cuo_codigo and
cuo_fraccion <> 0;

-- Insertando la fracción en el sistema
insert into cuota values (in_prg_codigo, in_cap_codigo,
in_cuo_codigo, num_fracciones + 1, var_valor_cuota, in_cuo_desc,
in_cuo_valor_total,
var_fecha_ideal, in_cuo_fecha_pago,current_date,
var_fecha_vencim, var_fecha_vigen,''Ca'',null,in_fac_prefijo,
in_fac_numero,var_fecha_ideal,null,null,null);

-- Actualizando la cuota al terminar de pagarla con fracciones
update cuota set cuo_valor_cuota = totalFraccion,
cuo_fecha_pago = in_cuo_fecha_pago,
cuo_fecha_ingreso = current_date,
est_codigo = ''Ca'',
fac_prefijo = in_fac_prefijo,
fac_numero = in_fac_numero
where prg_codigo = in_prg_codigo and cap_codigo =
in_cap_codigo and cuo_codigo = in_cuo_codigo and cuo_fraccion = 0;

end if;
-- Se coloca la restricción a la carpeta de pago si es necesario
cantMora := cantidad_cuotas_morosas(in_prg_codigo, in_cap_codigo);

if ((in_cuo_estado = ''Mo'') and (cantMora = 0)) then

restriCod := get_codigo_restriccion(''Cubrimiento Por Atrazo'');

if
(existe_restriccion(in_prg_codigo,in_cap_codigo,restriCod,in_cuo_fecha_pago
+ 1, in_cuo_fecha_pago + 16) = ''F'') then

insert into restriccion_carpeta_pago values
(in_prg_codigo,in_cap_codigo,restriCod,current_date + 1, current_date + 16);

end if;
end if;

else

-- Seleccionar la cuota principal para sacar los datos
necesarios para crear la fracción
insert into cuota values (in_prg_codigo, in_cap_codigo,
in_cuo_codigo, num_fracciones + 1, in_cuo_valor_total + (var_valor_cuota *
(in_cuo_desc/100)), in_cuo_desc, in_cuo_valor_total,
var_fecha_ideal, in_cuo_fecha_pago,current_date, var_fecha_vencim,
var_fecha_vigen,''Ca'',null,in_fac_prefijo,
in_fac_numero,var_fecha_ideal,null,null,null);

select sum(cuo_valor_cuota) INTO pagadoC from cuota where prg_codigo
= in_prg_codigo and cap_codigo = in_cap_codigo
and cuo_codigo = in_cuo_codigo and
cuo_fraccion <>0;

if ((pagadoC >= (var_valor_total * 0.8)) and (in_cuo_estado <>
''Mo'') and (in_cuo_estado <> ''Cu'')) then

cursorProxPago:=fec_pag_cuota_siguiente(in_prg_codigo,in_cap_codigo,in_cuo_codigo,''ref'');

-- Sacando las variables
LOOP
FETCH cursorProxpago into fecIdeal, fecLimite;
EXIT;

END LOOP;

-- Si ha pagado mas del 80% de la cuota se mueve la fecha de
cobro de ésta
update cuota set cuo_valor_cuota = var_valor_cuota -
in_cuo_valor_total - (var_valor_cuota * (in_cuo_desc/100)),
cuo_fecha_ideal_pago =fecIdeal,cuo_fecha_vencim =fecLimite where
prg_codigo = in_prg_codigo and cap_codigo = in_cap_codigo and cuo_codigo =
in_cuo_codigo and cuo_fraccion = 0;
close cursorTemp3;
else

update cuota set cuo_valor_cuota = var_valor_cuota -
in_cuo_valor_total - (var_valor_cuota * (in_cuo_desc/100))
where prg_codigo = in_prg_codigo and cap_codigo = in_cap_codigo
and cuo_codigo = in_cuo_codigo and cuo_fraccion = 0;

end if;

end if;

return 1;

end;
'language 'plpgsql'

--
Ing Sistemas y Telecomunicaciones
Luis Felipe Lopez Amezquita
3008217523 - 3162589699

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-03-16 19:38:53 Re: [GENERAL] Concurrencia
Previous Message Mario Gonzalez 2006-03-16 19:19:58 Re: [GENERAL] Concurrencia