|
| 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')
| |
|
|