Hallo Allerseits,
Es ist ja bekannt, das man SQL queries, die man häufiger verwendet einmal preparen sollte,
um dann bei jeder verwendung mit execute die variablen einzubinden. Das geht dann nämlich viel schneller,
als den statement bei jeder benutzung neu zu preparen und zu executen.
Bei einem einfachen loop ist es ja kein Problem. Man preparet erstmal und bei jedem durchgang executet
man dann mit einer anderen Variable und loopt dann über die results mit fetchrow.
Die technik schein allerdings nicht für eine Rekursion zu funktionieren, weil dabei die preparierten
statements anscheinend irgendwie verloren gehen. Es funktioniert nur so lange, bis die Rekursion die
tiefste Ebene erreicht und zum ersten mal in ein Unterprogramm zurückspringt, von wo sie aufgeraufen
wurde.
Ok das ist ziemlich kompliziert, daher kommt jetzt mal ein plastisches beispiel. Hier ist ein eine
Routine, die eine auflistung von einem Kategoriebaum erstellt, typischerweise verwendet für
Verzeichnisstrukturen.
Als erstes preparen wir mal einen SQL query, der die Unterverzeichnisse zu dem übergegebenem Verzeichnis
ausgibt. Wir executen das dann mit der ID des übergebenen Verzeichnisses und wir erhalten die besagte
Liste der Unterverzeichnisse. Wir drehen eine Schleife um all die Unterverzeichnisse, und rufen die
selbe Funktion für jedes Unterverzeichnis aus, um auch deren Unterverzeichnisse aufzulisten.
generates a category_tree
sub open_all_categories
{
my $parent = $_[0];
my $select = $dbh->prepare($sql);
$select->execute($parent);
if ($DBI::err) {&error($DBI::errstr)}
while ( ($cat_id, $category_name) = $select->fetchrow() )
{
# add a line to the category tree
$category_tree .= $category_name;
# follow recursion
&open_all_categories($cat_id);
}
$select->finish();
}
In dieser Form klappt das hervorragend. Allerdings wird hier jedes einzelne SQL query prepared.
Ich habe versucht den prepare() Aufruf aus der Funktion rauszunehmen und nur das execute() mit
der ID des Verzeichnisses drinzulassen. Dann passiert aber nur folgendes:
Die Funktion schlängelt sich durch solange sie über die gefundenen Verzeichnisse loopt oder sich
selbst aufruft, um eine Ebene tiefer zu gehen. Beim ersten "zurückspringen" auf einen höhere Ebene,
(d.h. keine Unterverzeichnisse gefunden) hört sie dann auf. Das preparte Statement scheint verloren
gegangen zu sein.
Hat jemand sowas schon mal hingekriegt?
Gruß
Cruz