Hallo,
Spricht irgendetwas gegen die zweite Methode mit selectrow_array?
Nein, solange Du genau diese Funktionalität willst.
Was ist besser zu verwenden??
Das hängt von der Aufgeabenstellung ab. selectrow_array ist nichts anderes als eine Zusammenfassung von Methoden, solltest Du aber mehr Kontrolle über die Funktionsweise haben wollen, so mußt Du eben die einzelnen Methoden in Deinem Code aufrufen.
Außerdem kannst Du mit selectrow_array immer nur genau einen Record abfragen.
Sollte die Abfrage mehrere Records zurückliefern, dann ist selectrow_array ungeeignet.
Muss ich eigentlich @row verwenden, oder geht auch $row ?
Nach Studium der Dokumentation ("If called in a scalar context it returns the first field of the first row.")
und des Codes
return $row[0] unless wantarray;
return @row;
ergibt sich eindeutig, daß auch $row etwas sinnvolles zurückgibt.
Ich denke, das ist für solche Fälle
my $testvalue = $dbh->selectrow_array('SELECT test FROM table WHERE id=2');
wenn Du also nur genau eine Spalte eines bestimmten Records abfragen willst.
BTW.:
Versuche aber nicht sowas zu basteln:
foreach $id (@ids)
{
my $name = $dbh->selectrow_array("SELECT name FROM table WHERE id=$id");
my $adresse = $dbh->selectrow_array("SELECT adresse FROM table WHERE id=$id");
[...]
print "Die Adresse von $name ist $adresse\n";
}
Das würde hoffnungslos unperformat sein, und die Datenbank unnötig belasten.
Der Grund liegt darin, daß dann für jede Spalte und jeden gewünschten Record eine neue Abfrage an die Datenbank generiert wird, welche dieses Statement vollkommen neu bearbeiten muß.
Naja, die Tabelle würde zwar irgendwie gecachet werden, aber der Verwaltungsaufwand für Statementparsing und der eigentlichen Abfrageausführung ist noch immer nicht zu verachten.
Möglicher Ansatz wäre:
my $ids = join(',',@ids);
my $sth = $dbh->prepare("SELECT name,adresse FROM table WHERE id in ($ids)");
$sth->execute;
my($name,$adresse);
while(($name,$adresse) = $sth->fetchrow_array)
{
print "Die Adresse von $name ist $adresse\n";
}
Das aber nur so am Rande.
Grüße
Klaus