bionic
27-01-2006, 15:41
Hi miteinander,
ich habe ein Problem an dem ich mir die Zähne ausbeisse. Ich habe die Funktion schon viele male umgeschrieben, aber leider ohne das gewünschte Ergebnis.
Ich habe in einer Oracle 9i Datenbank eine table mit mehreren Einträgen. Die Datenbank hat 360 Zeilen, die meisten sind NULL.
Aufgabe der Funktion:
Die Funktion soll alle Datensätze mit der gewünschten ID auslesen. Das sind 1 bis n Einträge.
Danach soll sie die Einträge miteinander vergleichen. Ist ein Wert überall identisch, wird dieser Wert in einen Hash geschrieben. Gibt es irgendwo eine Abweichung, d.h. mindestens ein Datensatz ist anders als die anderen, soll "item_locked" in den Hash für diese Kategorie geschrieben werden.
Nun, meine Funktion funktioniert soweit ganz gut, wenn ein Datensatz ausgewählt ist. Sie schafft auch mehrere, aber ab und zu (Ich vermute, wenn zu viele Abweichungen auftauchen) bei so ca. 5-10 (unterschiedlich von Mal zu Mal!) crashed mir das Skript. Die Fehlermeldung im Browser ist ein HTTP 500, ein interner Serverfehler.
Der Errorlog meint folgendes:
[DATUM] failure (18704): for host MEINE_IP trying to GET /cgi-bin/dev/debug.pl, cgi_scan_headers reports: the CGI program cgi-bin/dev/debug.pl did not produce a valid header (too many headers from CGI script (max 200))
Ein Headererror weist ja auf einen fehlenden Header hin. Das ist allerdings nicht das Problem, es wird ein korrekter Header geschrieben. (sonst funktionierts ja auch)
Ich vermute, dass irgendwo in meiner Funktion jeweils ein Header geschrieben wird. Ich habe leider keine Ahnung, wo das passiert.
Hat jemand einen heissen Tipp?
Vielen Dank für eure Hilfe!
bionic
sub get_datasets {
my $dbh = shift;
my $tabletemp = shift;
my $id = shift;
my @results;
my %temp;
my %hash;
my $sql="SELECT * FROM $tabletemp WHERE ID='$id'";
my $sth = $dbh->prepare($sql) or die $dbh->errstr();
$sth->execute or die $dbh->errstr();
while (my $hash_ref = $sth->fetchrow_hashref) {
push(@results,$hash_ref);
}
$sth->finish ();
foreach (@results){
%temp = %{$_};
foreach (keys(%temp)){
if (!defined $hash{$_}){
$hash{$_} = $temp{$_};
}
elsif ($hash{$_} ne $temp{$_}){
$hash{$_} = "item_locked";
}
}
%temp = ();
}
return %hash;
}
ich habe ein Problem an dem ich mir die Zähne ausbeisse. Ich habe die Funktion schon viele male umgeschrieben, aber leider ohne das gewünschte Ergebnis.
Ich habe in einer Oracle 9i Datenbank eine table mit mehreren Einträgen. Die Datenbank hat 360 Zeilen, die meisten sind NULL.
Aufgabe der Funktion:
Die Funktion soll alle Datensätze mit der gewünschten ID auslesen. Das sind 1 bis n Einträge.
Danach soll sie die Einträge miteinander vergleichen. Ist ein Wert überall identisch, wird dieser Wert in einen Hash geschrieben. Gibt es irgendwo eine Abweichung, d.h. mindestens ein Datensatz ist anders als die anderen, soll "item_locked" in den Hash für diese Kategorie geschrieben werden.
Nun, meine Funktion funktioniert soweit ganz gut, wenn ein Datensatz ausgewählt ist. Sie schafft auch mehrere, aber ab und zu (Ich vermute, wenn zu viele Abweichungen auftauchen) bei so ca. 5-10 (unterschiedlich von Mal zu Mal!) crashed mir das Skript. Die Fehlermeldung im Browser ist ein HTTP 500, ein interner Serverfehler.
Der Errorlog meint folgendes:
[DATUM] failure (18704): for host MEINE_IP trying to GET /cgi-bin/dev/debug.pl, cgi_scan_headers reports: the CGI program cgi-bin/dev/debug.pl did not produce a valid header (too many headers from CGI script (max 200))
Ein Headererror weist ja auf einen fehlenden Header hin. Das ist allerdings nicht das Problem, es wird ein korrekter Header geschrieben. (sonst funktionierts ja auch)
Ich vermute, dass irgendwo in meiner Funktion jeweils ein Header geschrieben wird. Ich habe leider keine Ahnung, wo das passiert.
Hat jemand einen heissen Tipp?
Vielen Dank für eure Hilfe!
bionic
sub get_datasets {
my $dbh = shift;
my $tabletemp = shift;
my $id = shift;
my @results;
my %temp;
my %hash;
my $sql="SELECT * FROM $tabletemp WHERE ID='$id'";
my $sth = $dbh->prepare($sql) or die $dbh->errstr();
$sth->execute or die $dbh->errstr();
while (my $hash_ref = $sth->fetchrow_hashref) {
push(@results,$hash_ref);
}
$sth->finish ();
foreach (@results){
%temp = %{$_};
foreach (keys(%temp)){
if (!defined $hash{$_}){
$hash{$_} = $temp{$_};
}
elsif ($hash{$_} ne $temp{$_}){
$hash{$_} = "item_locked";
}
}
%temp = ();
}
return %hash;
}