Thread DBI: Exception Model RaiseError
(15 answers)
Opened by rosti at 2011-03-23 10:21
Hallo,
Quote Damit geht der Sinn einer Callbackfunktion verloren, der darin besteht, die Datenmengen im Hauptspeicher klein zu halten. Es gibt prizipiell zwei Möglichkeiten: 1 wie Du schreibst, das Abfrageergebnis wird als Variable verarbeitet, als Array-Ref, oder Hash-Ref, z.B. eine Tabelle, die Daten liegen komplett im RAM 2 es wird eine Callbackfunktion gerufen, die Record für Record sofort auf die Ausgabe schreibt, im RAM liegt dann jeweils nur ein Record Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # URL-Details als Callback sub cb_urldetails{ my $self = shift; # in der DB Klasse my $cbref = shift; # CodeRef CallbackFunktion my $url = shift; my $q = q(SELECT ref, FROM_UNIXTIME(ts) as date, hugo FROM log WHERE url=? ORDER BY date DESC); my $st = $self->{DBH}->prepare($q); eval{ $st->execute($url); }; if($@){ $self->{EVE} = $@; return $@; } else{ if(ref $cbref eq 'CODE'){ while(my $ref = $st->fetchrow_hashref){ &$cbref($ref); # Callback } } } } Das Statement wird getestet und ausgeführt. Ab Zeitpunkt der Ausführung wird die CB-Funktion gerufen. Wenn die auszugebende Datenmenge feststeht, bevorzuge ich Variante (1). Hier ist die Fehlerbehandlung einfach. Ist es so, dass die Datenmenge variiert, bevorzuge ich die Ausgabe mit einer Callbackfunktion. Viele Grüße, Rolf |