Abrufen aller Datensätze, die mit Perl DBI
Habe ich ein Perl-Skript, dass verwendet eine DBI Verbindung. Ich öffnen und Lesen der SQL-Skript-Datei über eine sub-routine. Ich Schreibe nur einen Eintrag, wo ich noch zwei (drei Datensätze insgesamt). Wie bekomme ich alle Datensätze?
Ergebnis:
Alert:OUTBOUND_DATA:0
Skript:
my $dbh_oracle = DBI->connect(
$CFG{oracle_dbi_connect},
$CFG{db_user},
$CFG{db_cred},
{AutoCommit => 0,
RaiseError => 0,
PrintError => 0}) or die ("Cannot connect to the database: ".$DBI::errstr."\n");
my ($val1, $val2) = get_data();
print "Alert:$val1:$val2\n";
send_email("Alert:$val1:$val2");
sub get_data
{
undef $/;
open (my $QFH, "< /sql/summary.sql") or die "error can't open this file $!";
my $sth= $dbh_oracle->prepare(<$QFH>) or
die ("Cannot connect to the database: ".$DBI::errstr."\n");
$sth->execute;
close $QFH;
my $row = $sth->fetchrow_hashref;
$sth->finish;
return @$row{'MYTABLE','FLAG'};
}
sub send_email {
my $message = shift;
open (MAIL, "|/usr/sbin/sendmail -t") or die "Can't open sendmail: $!";
print MAIL "To: me\@test.com\n";
print MAIL "From: Data\n";
print MAIL "\n";
print MAIL $message;
close MAIL;
}
exit;
ERGEBNISSE aus der Abfrage: (mehr als 1 rec)
MYTABLE FLAG
----------------------- ----------
OUTBOUND_DATA 0
MSGS_BY_DIM 0
INBOUND_DATA 0
3 rows selected.
Sie könnte
Auch Stelle ich fest, dass Sie beide
RaiseError => 1
und beseitigen Sie die Notwendigkeit für diejenigen, die () - Aufrufe.Auch Stelle ich fest, dass Sie beide
RaiseError
und PrintError
deaktiviert. Die erste bewirkt, dass Fehler tödlich sein und der zweite wird mindestens drucken Sie (aber nicht kill your code). Sie sollten wahrscheinlich mindestens einer dieser auf den Wert true, damit Ihre Fehler stillschweigend verworfen.InformationsquelleAutor cjd143SD | 2012-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt auch davon ab, wie Sie die Strukturierung Ihrer gesamten Skript. Ihre
get_data()
nennen, nur ein einziges paar Werte zurückgegeben werden. Ich sehe zumindest ein paar Optionen: entweder zurück ein hash (Referenz), in der alle Daten und lassen Sie diemain
montieren, oder verwenden Sie die loop-Konstrukte, die bereits erwähnt und fertigen die Körper der Nachricht innerhalb der Unterroutine, wenn nur ein einzelner skalarer string.Zur Rückgabe aller Daten als hash-Referenz, die
get_data
Unterroutine könnte wie folgt Aussehen (Hinweis: ich bin mitfetchall_hashref
stattfetchrow_hashref
:Und rufen Sie es von
main
und verwenden Sie die Ausgabe wie folgt:Dadurch wird
$message
mit:Ist und möchten Sie vielleicht höflich:
bevor Sie verlassen.
Dieser hat einige Probleme, für Beispiel, Sie habe die SQL versteckt in einem externen Skript, aber ich habe gegriffen zu hart codierte Schlüssel (MYTABLE, ich bin vorausgesetzt ist einzigartig in Ihrer Abfrage) und den Wert (FLAG) in der Skript, welches die Begrenzung später, wenn Sie erweitern möchten.
main
Beispiel als eine Möglichkeit, zu montieren die Ausgabe.InformationsquelleAutor gkaupas
Gibt es viele verschiedene Möglichkeiten können Sie abrufen von Daten aus einer Anweisung verarbeiten. Die häufigsten sind Recht einfach, und Ihre Verwendung ist unten dargestellt:
Den ersten, fetchrow_array, zurück, die jede Zeile wiederum als array. Ein Beispiel mit Daten zurückgegeben, die von der select-oben könnte sein:
Das zweite Beispiel ist ähnlich, aber liefert eine array-Referenz anstatt eines Arrays:
Dem Dritten Beispiel fetchrow_hashref, oft die meisten lesbar:
danke für die Beispiele.
Diese Antwort ist nicht vollständig ohne die Erwähnung @gpojd 's Antwort mit den
selectall_
FunktionenInformationsquelleAutor Ωmega
Diese Linie sollte eine Schleife:
Sollte es sein:
Wenn Sie das lieber haben-DBI-do die Schleife für Sie, überprüfen Sie heraus selectall_arrayref oder selectall_hashref
$sth->finish
? wäre das nach ichreturn @$row
?wenn Sie fertig sind, wird der loop $sth- > fetchrow_hashref wird return undef und "Ende" selbst.
InformationsquelleAutor gpojd
Den
fetchrow_
Methoden buchstäblich nur fetch eine Zeile zu einem Zeitpunkt.Wenn Sie möchten, dass alle Zeilen, in der einige Spalten, Sie können schlecht schieben um Daten-Strukturen, oder verwenden Sie einen Anruf bedeutete für Ihre situation.
Es scheint mir, die Sie verwenden möchten
selectcol_arrayref
in:Die Spalte Indizes beziehen sich auf die position der Spalten im ResultSet, nicht in der ursprünglichen Tabelle.
Die Art und Weise Sie die zurückgegebenen Ergebnisse werden auch geändert werden müssen, um alle Zeilen zurückgegeben werden.
Außerdem haben Sie:
weil Sie schlürfen die Datei mit den SQL. Allerdings
$/
ist eine Globale variable. Sollten Sie verwendenlokale $/
im kleinstmöglichen Umfang. Also:selectcol_arrayref
wäre die Wahl. Dein Vorschlag für die Verwendunglocal $/
, würde ich das als Unterprogramm oder lassen Sie diese außerhalb? danke.InformationsquelleAutor Sinan Ünür