/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
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')

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407936
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste