$query[$level]->execute; while((@level_data)=$query[$level]->fetchrow_array) { %treepos = (); # reset the whereclause for a new branch %pathpos = (); $treepos{$key} = shift @level_data; $pathquery[$level] = &path_sql($childlevel,$treepos{$key}); while((@path_data)=$pathquery[$level]->fetchrow_array) { $pathpos{$key} = shift @path_data; &level_proc; } } sub level_proc { $query[$childlevel] = &level_sql($childlevel,$treepos{$key}); while((@level_data)=$query[$childlevel]->fetchrow_array) { &setlevel($childlevel); $treepos{$key} = shift @level_data; &path_proc; $treepos{$key} = undef; &setlevel($parlevel); } sub path_proc { $pathquery[$level]= &path_sql($pathpos{$parkey},$treepos{$key}); while((@path_data)=$pathquery[$level]->fetchrow_array) { $pathpos{$key} = shift @path_data; &children_proc; } } } sub children_proc { &children_sql($pathpos{$key},$childlevel); &level_proc; }