tengo un script que escribe sobre una base de datos, y las tablas tienen llaves foraneas.
al momento de realizar $dbh_final->commit, me genera un error que indica que estoy violando una llave foranea, pero al momento de escribir en la base de datos, mantengo el orden de los datos.
debo indicar que trabajo con postgres, mod_perl y apache, pero como esto esta relacionado 100% con Perl lo he posteado aca
Este es el codigo (me falta cepillar el codigo, ya que estoy en contra del tiempo):
************************************************** *********************************
package Clonar;
use General;
use Data::Dumper;
use DBI;
sub clonar_datos {
my $id_familia = shift;
my $familia = $dbh->prepare("select * from familia where id_familia=$id_familia");
$familia->execute();
while (my ($f) = $familia->fetchrow_hashref) {
# verificar datos del promotor familiar, ingresar si corresponde
my $usuario = $dbh_final->prepare("select id_usuario from usuario where id_usuario='$f->{id_promotor_asignado}'");
$usuario->execute;
while (my ($usr) = $usuario->fetchrow_array) {
if ($usr ne $f->{id_promotor_asignado}) {
my $usuario_puente = $dbh->prepare("select * from usuario where id_usuario='$f->{id_promotor_asignado}'");
$usuario_puente->execute;
while (my ($u) = $usuario_puente->fetchrow_hashref) {
my $usuario_final = $dbh_final->prepare("insert into usuario(id_usuario,id_tipo_usuario,id_comuna,nombr e,passwd,email,tel,cel,ind_activo,ind_primer_login ,apaterno,amaterno,sexo,ciudad,educacion,profesion ,fecha_nac) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$usuario_final->execute($u->{id_usuario},$u->{id_tipo_usuario},$u->{id_comuna},$u->{nombre},$u->{passwd},$u->{email},$u->{tel},$u->{cel},$u->{ind_activo},$u->{ind_primer_login},$u->{apaterno},$u->{amaterno},$u->{sexo},$u->{ciudad},$u->{educacion},$u->{profesion},$u->{fecha_nac});
}
#tabla promotor (campo id_promotor y tipo_promotor
my $promotor = $dbh_final->prepare("select id_promotor from promotor where id_promotor = '$f->{id_promotor_asignado}'");
$promotor->execute;
while (my ($promo) = $promotor->fetchrow_array) {
if ($promo ne $f->{id_promotor_asignado}){
my $promotor_puente = $dbh->prepare("select * from promotor where id_promotor = '$f->{id_promotor_asignado}'");
$promotor_puente->execute;
while (my ($p) = $promotor_puente->fetchrow_hashref) {
my $promotor_final = $dbh_final->prepare("insert into promotor(id_promotor, tipo_promotor) values(?,?)");
$promotor_final->execute($p->{id_promotor},$p->{tipo_promotor});
}
}
}
}
}
# verificar datos de la familia, ingresar si corresponde
my $family = $dbh_final->prepare("select id_familia from familia where id_familia = $id_familia");
$family->execute;
while(my ($fam) = $family->fetchrow_array) {
if ($fam != $f->{id_familia}) {
my $familia_final = $dbh_final->prepare("insert into familia(id_familia,id_comuna,id_promotor_asignado, nombre,direccion,nombre_representate,tel,cel,id_et nia,ind_participacion,situacion) values(?,?,?,?,?,?,?,?,?,?,?)");
$familia_final->execute($f->{id_familia},$f->{id_comuna},$f->{id_promotor_asignado},$f->{nombre},$f->{direccion},$f->{nombre_representate},$f->{tel},$f->{cel},$f->{id_etnia},$f->{ind_participacion},$f->{situacion});
}
}
# verificar datos de los integrantes, ingresar si corresponde
my $persona = $dbh->prepare("select * from persona where id_familia=$f->{id_familia}");
$persona->execute;
while (my ($pers) = $persona->fetchrow_hashref) {
if ($dbh_final->selectrow_array("select count(*) from persona where id_persona=$pers->{id_persona}")) {
# existe
} else {
# no existe
my $persona_final = $dbh_final->prepare("insert into persona(id_persona,id_actividad,id_parentezco_pers ona,id_familia,nombre,ape1,ape2,sexo,fec_nac,rut) values(?,?,?,?,?,?,?,?,?,?)");
$persona_final->execute($pers->{id_persona},$pers->{id_actividad},$pers->{id_parentezco_persona},$id_familia,$pers->{nombre},$pers->{ape1},$pers->{ape2},$pers->{sexo},$pers->{fec_nac},$pers->{rut});
}
}
}
}
$dbh_final->commit();
1;
************************************************** ******************
Gracias de antemano