Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/01/2013, 13:08
morhy_fernandez
 
Fecha de Ingreso: enero-2013
Mensajes: 6
Antigüedad: 11 años, 11 meses
Puntos: 0
error al tratar de insertar datos en una función de postgres

Hola amigos del foro, tengo un problema cuando trato de insertar datos de una función. Tengo dos tablas relacionas entre si por la llave primaria, la primera tabla es la cabezera donde guardo los datos de algún préstamo hecho por los socio, donde esta los datos del número de préstamo(pk), la cantidad de cuotas, el valor del préstamo,y la taza de intéres, la segunda sería los detalles de dicho préstamo, dónde la llave primaria es el número de préstamo, y guardo la cantidad de cuotas, el intéres pagado en cada cuota, la amortización de cada cuota, y el monto de cada cuota, la función que hice calcula todo bien los intéres, amortización y cuota, pero al tratar de insertarlos en la tabla de detalles de prestamos de un error, y no se como resolverlo.

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,f echa_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,amortizacio n,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'19 95-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,amortizacio n,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'19 95-01-01','pendiente')»
PL/pgSQL function "sist_frances" line 29 at sentencia SQL

Si algiuén puede ayudarme le agradecería mucho.