PostgreSQL - Error de duplicación en una función de postgres

 
Vista:

Error de duplicación en una función de postgres

Publicado por kayas (2 intervenciones) el 08/01/2013 02:36:20
Buenas noches, tengo un problema de duplicación en una función de postgresql que calcula el interés, la amortización y la cuota en el sistema francés de un préstamo, tengo dos tablas relacionas entre si por la llave primaria, una que es la tabla prestamos con pk cod_pres y otra detalles_prestamos con pk(fk)cod_pres, al ejecutar la función me envia un error de duplicación de llave primaria.
Este es el función como la hice.
Estas son mis dos tablas hechas en postgresql

create table prestamos
(socio_nro int not null,
cod_pres serial not null, check(cod_pres>0),
fecha date,
tipo_pres varchar(20) not null,
sist_pago varchar(20) not null,
monto_solic int not null,check(monto_solic>=500000 and monto_solic<=10000000),
destino varchar(10),
monto_aprob int not null, check(monto_aprob>=500000 and monto_aprob<=10000000),
plazo int not null, check(plazo>=6 and plazo<=30),
t_interes float not null,
estado varchar(20) not null,
primary key(cod_pres),
foreign key(socio_nro) references socios(socio_nro));


create table det_prestamos
(cod_pres int not null,
nro_cuo int not null, check(nro_cuo>=6 and nro_cuo<=30),
interes int not null, check(interes>0),
amortizacion int not null, check(amortizacion>0),
cuota int not null, check(cuota>=0),
fecha_venc date,
estado varchar(20),
primary key(cod_pres),
foreign key(cod_pres) references prestamos(cod_pres));

Este el código de mi función

create or replace function sist_frances(a_codPres int,a_interes float,a_cant int,a_valor int)
returns void as $$
declare
v_ncuotas bigint:=0;
v_acumulado bigint:=0;
v_pendiente bigint:=a_valor;
v_amortAcum bigint:=0;
ou_interes bigint;
amort bigint;
x float:=a_interes;
y int:=a_cant;
c float;
c1 float;
i float;

begin
i:=x/100;
c:=((1+i)^y*i)/((1+i)^y-1);
c1=round(v_pendiente*c);

while(v_ncuotas< a_cant) loop
v_ncuotas=v_ncuotas+1;
ou_interes=round(v_pendiente*i);
v_acumulado=round(v_acumulado+ou_interes);
amort=round(c1-v_pendiente*i);
v_amortAcum=round(v_amortAcum+amort);
v_pendiente=round(v_pendiente-amort);

insert into det_prestamos(nro_cuo,interes,amortizacion,cuota,fecha_venc,estado) values(v_ncuotas,ou_interes,amort,c1,'1995-01-01','pendiente');

end loop;

end;
$$ LANGUAGE plpgsql

select sist_frances(1,2,6,1000000); // con este llamo a la función

y me da el siguiente error
ERROR: llave duplicada viola restricción de unicidad «det_prestamos_pkey»
DETAIL: Ya existe la llave (cod_pres)=(1).
CONTEXT: sentencia SQL: «insert into det_prestamos(cod_pres,nro_cuo,interes,amortizacion,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'1995-01-01','pendiente')»
PL/pgSQL function "sist_frances" line 29 at sentencia SQL


********** Error **********

ERROR: llave duplicada viola restricción de unicidad «det_prestamos_pkey»
SQL state: 23505
Detail: Ya existe la llave (cod_pres)=(1).
Context: sentencia SQL: «insert into det_prestamos(cod_pres,nro_cuo,interes,amortizacion,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'1995-01-01','pendiente')»
PL/pgSQL function "sist_frances" line 29 at sentencia SQL
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error de duplicación en una función de postgres

Publicado por John (1 intervención) el 07/10/2015 23:56:02
Ya aprendió para que me ayude? :) (Y) ..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar