|  | 		    
					
        
         
          
         
	
          | |  | DBI fjerne de rækker man netop har hentet Fra : Michael Andreasen
 | 
 Dato :  21-04-04 22:02
 | 
 |  | Hej.. Jeg er lidt i tvivl om hvordan man med DBI kan slette de records men
 lige har haft fat via fetchrow.
 
 Sceneraio: Jeg kører en fetchrow og smider mine resultater i en helt anden
 remote database. Derefter skal data blot slettes. Hvordan gøres dette
 smartest muligt.
 
 Benytter MySQL med InnoDB setup.
 
 Herunder er en kodestump, bortset fra den er kortet ned og der benyttes
 INNER JOIN's ser det således ud. Hvis der findes en smart måde på mit
 problem, hvorledes logger jeg så eventuelle fejlinserts. Eller endnu bedre..
 undlader at slette dem?
 
 kodestump:
 
 eval{
 my $sth = $dbh1->prepare("SELECT abc from tabel where condition=1");
 $sth->execute();
 
 while (@data = $sth->fetchrow()) {
 
 my $sth = $dbh2->prepare("INSERT INTO `$table` (ID, Name)
 VALUES ('@data[0]','@data[1]');
 $sth->execute();
 
 ....
 
 }
 
 Nogen der kan pege lidt i rigtige retning?
 
 --
 Mvh
 Michael
 
 
 
 
 |  |  | 
  Tore Aursand (21-04-2004) 
 
	
          | |  | Kommentar Fra : Tore Aursand
 | 
 Dato :  21-04-04 23:54
 | 
 |  | On Wed, 21 Apr 2004 23:01:46 +0200, Michael Andreasen wrote:
 > Sceneraio: Jeg kører en fetchrow og smider mine resultater i en helt
 > anden remote database. Derefter skal data blot slettes. Hvordan gøres
 > dette smartest muligt.
 >
 > [...]
 >
 > my $sth = $dbh1->prepare("SELECT abc from tabel where condition=1");
 > $sth->execute();
 >
 >      while (@data = $sth->fetchrow()) {
 >
 > my $sth = $dbh2->prepare("INSERT INTO `$table` (ID, Name) VALUES
 > ('@data[0]','@data[1]');
 >   $sth->execute();
 >
 > }
 
 Hva med denne?
 
 my $stSel = $dbh1->prepare( 'SELECT abc FROM t WHERE c = ?' );
 my $stIns = $dbh2->prepare( 'INSERT INTO t (ID, Name) VALUES (?, ?)' );
 my $stDel = $dbh1->prepare( 'DELETE FROM t WHERE c = ?' );
 
 $stSel->execute( 1 );
 while ( my ($id, $name) = $stSel->fetchrow_array() ) {
 $stIns->execute( $id, $name );
 $stDel->execute( 1 );
 }
 
 $stIns->finish();
 $stIns->finish();
 $stSel->finish();
 
 Evt. sletter du alle postene ut fra samme "condition" som du valgte dem
 ut, men etter at du er ferdig med å sette inn all informasjon inn i den
 andre databasen.
 
 
 --
 Tore Aursand <tore@aursand.no>
 "Life is pleasant. Death is peaceful. It's the transition that's
 troublesome." (Isaac Asimov)
 
 
 |  |  | 
  Peter Makholm (22-04-2004) 
 
	
          | |  | Kommentar Fra : Peter Makholm
 | 
 Dato :  22-04-04 08:08
 | 
 |  | 
 
            Tore Aursand <tore@aursand.no> writes:
 > Evt. sletter du alle postene ut fra samme "condition" som du valgte dem
 > ut, men etter at du er ferdig med å sette inn all informasjon inn i den
 > andre databasen.
 Så skal man på en eller anden måde sikre sig udelt adgang til tabellen
 - eventuelt ved at låse den i databasen.
 -- 
  Peter Makholm     |    Yes, you can fight it, but in the end the ultimate
  peter@makholm.net |                           goal of life is to have fun
 http://hacking.dk  |                                     -- Linus Torvalds
            
             |  |  | 
  Michael Andreasen (22-04-2004) 
 
	
          | |  | Kommentar Fra : Michael Andreasen
 | 
 Dato :  22-04-04 18:00
 | 
 |  | "Tore Aursand" <tore@aursand.no> skrev i en meddelelse
 news:pan.2004.04.21.22.53.05.266016@aursand.no...
 > On Wed, 21 Apr 2004 23:01:46 +0200, Michael Andreasen wrote:
 > > Sceneraio: Jeg kører en fetchrow og smider mine resultater i en helt
 > > anden remote database. Derefter skal data blot slettes. Hvordan gøres
 > > dette smartest muligt.
 > >
 > > [...]
 > Hva med denne?
 >
 >   my $stSel = $dbh1->prepare( 'SELECT abc FROM t WHERE c = ?' );
 >   my $stIns = $dbh2->prepare( 'INSERT INTO t (ID, Name) VALUES (?, ?)' );
 >   my $stDel = $dbh1->prepare( 'DELETE FROM t WHERE c = ?' );
 >
 >   $stSel->execute( 1 );
 >   while ( my ($id, $name) = $stSel->fetchrow_array() ) {
 >       $stIns->execute( $id, $name );
 >       $stDel->execute( 1 );
 >   }
 >
 >   $stIns->finish();
 >   $stIns->finish();
 >   $stSel->finish();
 >
 > Evt. sletter du alle postene ut fra samme "condition" som du valgte dem
 > ut, men etter at du er ferdig med å sette inn all informasjon inn i den
 > andre databasen.
 
 Ja det ser fint ud.. Det vil jeg kigge på.. Vil envidere låse tabellerne som
 forslået af Peter.
 
 Takker
 
 --
 Mvh
 Michael
 
 
 
 
 |  |  | 
   Kåre Olai Lindbach (22-04-2004) 
 
	
          | |  | Kommentar Fra : Kåre Olai Lindbach
 | 
 Dato :  22-04-04 18:13
 | 
 |  | On Thu, 22 Apr 2004 18:59:39 +0200, "Michael Andreasen"
 <ugyldig@email.dk> wrote:
 
 >"Tore Aursand" <tore@aursand.no> skrev i en meddelelse
 >news:pan.2004.04.21.22.53.05.266016@aursand.no...
 >> On Wed, 21 Apr 2004 23:01:46 +0200, Michael Andreasen wrote:
 >> > Sceneraio: Jeg kører en fetchrow og smider mine resultater i en helt
 >> > anden remote database. Derefter skal data blot slettes. Hvordan gøres
 >> > dette smartest muligt.
 >> >
 >> > [...]
 >> Hva med denne?
 >>
 >>   my $stSel = $dbh1->prepare( 'SELECT abc FROM t WHERE c = ?' );
 >>   my $stIns = $dbh2->prepare( 'INSERT INTO t (ID, Name) VALUES (?, ?)' );
 >>   my $stDel = $dbh1->prepare( 'DELETE FROM t WHERE c = ?' );
 >>
 >>   $stSel->execute( 1 );
 >>   while ( my ($id, $name) = $stSel->fetchrow_array() ) {
 >>       $stIns->execute( $id, $name );
 >>       $stDel->execute( 1 );
 >>   }
 >>
 >>   $stIns->finish();
 >>   $stIns->finish();
 >>   $stSel->finish();
 >>
 >> Evt. sletter du alle postene ut fra samme "condition" som du valgte dem
 >> ut, men etter at du er ferdig med å sette inn all informasjon inn i den
 >> andre databasen.
 >
 >Ja det ser fint ud.. Det vil jeg kigge på.. Vil envidere låse tabellerne som
 >forslået af Peter.
 
 Det kan være lurt å sette hele while-løkken i ett eval-statement også,
 og teste på $@, og så foreta en rollback av begge databasehandlerne
 dersom feil. (Transaksjons-behandling, med andre ord)
 
 --
 mvh/Regards Kåre Olai Lindbach
 (News: Remove '_delete_' and '.invalid')
 
 
 |  |  | 
 |  |