2009-04-29 7 views
3

Ich habe bereits auf der Website nach diesem gesucht, konnte aber nichts finden, was meine Frage beantwortet hat. Was bringt mich zu den Details:Wie überprüfe ich, ob mehr als ein Datensatz von DBI-Abfrage in Perl zurückgegeben wurde?

Ich Abfrage Datenbank mit einer einfachen Select-Abfrage, realistisch (angesichts des Szenarios) sollte es nie mehr als etwa 5 bis 6 Datensätze zurückgeben. Ich möchte nur überprüfen, ob mehr als einer zurückgegeben wurde. Und wenn mehr als eine return act darauf war (in einer else-Anweisung), wenn nur eine zurückgegeben wurde, dann gehe ich mit dem Skript voran.

 

my $sql = qq { SELECT col1, col2, col3 
       FROM table 
      WHERE col1 = 'foo' 
      }; 

my $sth = $dbc->prepare_cached($sql) or die "Could not prepare statement: " . $dbc->errstr; 

$sth->execute() or die "Could not execute statement: " . $sth->errstr; 

# Not sure how to efficiently check for more than one row returned and still progress if true... This is my problem! I'm thinking a nested if to see if any rows were returned, and then progress with the check of one or more rows? But how can this me checked (like a count function?) 
if (my $ref = $sth->fetchrow_hashref()) { 

# One row was returned... 

} else { 
# More than one row was returned... Uh oh! 
} 

Wenn euch eines Threads wissen, dass ich nicht so beantwortet diese Frage einfach umleiten meine ausfindig machen konnte, und ich werde diesen Thread zunichte machen!

Grüße, BorisTheBulletDodger!

+0

Welche Arbeit werden Sie in der sonst tun, wenn mehr als eine Zeile zurückgegeben wird? – mleykamp

+0

Ich werde einen Fehler protokollieren, der besagt, dass doppelte Zeilen für diese Abfrage vorhanden sind. –

Antwort

1

Verwenden Sie eine der fetchall_* oder selectall_* Methoden (siehe DBI documentation), da Sie nur 5-6 höchstens haben. Bestimmen Sie dann, wie viele Zeilen Sie erhalten haben.

4

Die einzige Möglichkeit zur autoritativen Bestimmung, ob mehr als eine Zeile von einer SELECT gefunden wurde, besteht darin, mehr als eine Zeile abzurufen. DBI stellt die ->rows-Eigenschaft zur Verfügung, aber es funktioniert nur für Nicht-SELECT-Anweisungen.

Die Antworten auf How can I check if a database query will return results? können auch nützlich sein, auch wenn es nicht ganz die gleiche Frage ist.

+0

Danke für diesen Link Dave. So aufschlussreich wie es war, scheint dieser Typ sich darauf zu konzentrieren, irgendwelche oder keine Daten zu bekommen! während ich mich darauf konzentriere, keine Daten oder einen (Datensatz) zu erhalten, wenn mehr als eins zurückgegeben wird, führe dann den "Oh oh!" Sektion! Ich glaube, es gibt eine Einschränkung in DBI, die keine Zählfunktion für ausgewählte Zustände bietet. Auch wenn es nur eine Teilzählung ist. –

5
my $sth = $dbh->prepare(); 
$sth->execute(); 

my $row = $sth->fetchrow_hashref(); 
my $second = $sth->fetchrow_hashref(); 

if ($second) { 
    print "2+ rows\n"; 
} elsif ($row) { 
    print "1 row\n"; 
} else { 
    print "no rows\n"; 
} 
+0

Das war der Weg, an den ich anfangs dachte. Ich denke, das reicht! –

+0

Versuchte dies, wählt dies einfach erneut aus und füllt die gleiche Zeile in $ 2. wie in Zeile $. Dies funktioniert derzeit nicht. –

6
my $sth = $dbh->prepare("SELECT col1, col2, col3 FROM tablename"); 
$sth->execute(); 
my $rows = $sth->fetchall_arrayref({}); 
if (@$rows == 0) { 
    die "no rows returned"; 
} elsif (@$rows > 1) { 
    die "too many rows returned"; 
} 
my $row = $rows->[0]; 
print "col1 is $row->{col1}\n"; 
+1

Danke für diesen einen Chas, schnelle Frage aber! Was würde passieren, wenn keine Zeilen zurückgegeben würden? Ich versuche, einen bestimmten Fehler zu protokollieren, wenn keine Zeilen zurückgegeben wurden, einen anderen (anderen) Fehler, wenn mehr als eine Zeile zurückgegeben wurde, oder einfach nur mit dem Skript fortzufahren, da nur eine Zeile zurückgegeben wurde. Dies gilt nur, wenn es eine zweite Reihe gibt! (Immer noch ... das ist eine sehr gute Lösung) Danke –

+1

Hmm, Punkt, es würde mit "zu vielen Reihen" sterben, lass mich das beheben. –

+0

Ich habe ein Problem, die Zeilen hier tatsächlich zu zählen. Die $ rows-Eigenschaft scheint einen "ARRAY (0x1ae2a6c)" -Wert zurückzugeben. Ich habe zahlreiche Methoden versucht, um Wert zu erhalten, aber keiner scheint erfolgreich zu sein. Danke –

Verwandte Themen