2010-10-22 8 views
1

En fait, j'ai exécuté la requête postgres, supposons qu'elle renvoie les 10 lignes. Maintenant, j'ai ce gestionnaire de déclaration ($ sth).perl dbi: fetchrow_arrayref

print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 
print Dumper $sth->fetchrow_arrayref; 

Maintenant, je l'ai tiré par les cheveux les 5 lignes du gestionnaire de l'instruction (STH de $ .Maintenant Je veux revenir $ pointeur de référence STH à la ligne 1ème .....

Que dois-je faire ....?

Merci

Répondre

4

Vous ne pouvez pas le faire. Les curseurs de base de données sont conçus pour être lus ligne par ligne, comme un ruisseau, sans rebobinage.

Vous nE ne ed pour copier les données dans un tableau en mémoire si vous voulez sauter.

La meilleure façon serait de faire

my $all_rows = $sth->fetchall_arrayref; 

qui vous donne un arrayref, avec une entrée pour chaque ligne, chaque ligne dans le même format que fetchrow_arrayref produit.

+0

Cela fonctionnera-t-il réellement? On m'a dit que pour arrayref la même référence de tableau est utilisée à chaque fois. vous ne pouvez donc pas stocker la référence du tableau et l'utiliser plus tard, car les données qui l'accompagnent sont remplacées. Mais j'essaie de le confirmer. – Jonathon

+0

Juste exécuté un test, et je peux vérifier au moins dans certains cas, vous ne pouvez pas simplement stocker la référence. Comme c'est la même référence à chaque fois. La documentation dit ceci: "Notez que la même référence de tableau est retournée pour chaque extraction, donc ne stockez pas la référence et ne l'utilisez pas après une extraction ultérieure., De plus, les éléments du tableau sont également réutilisés pour chaque ligne, alors faites attention si vous voulez prendre une référence à un élément. " Non, il n'y a rien de mal avec cet exemple exact, juste en le combinant avec le code des affiches d'origine. – Jonathon

+0

Oui, si vous récupérez une seule ligne, vous ne voulez pas stocker cette référence, car elle sera réutilisée lorsque vous récupérerez la suivante. "fetchall" devrait être sûr, cependant. – Thilo

0

une autre façon de traiter de votre requête de résultat, vous pouvez faire une boucle au-dessus:

while(my $res = $sth->fetchrow_arrayref()) {do something} 
1

Dans une boucle while.

  1. Récupérer ligne.
  2. Si c'est quelque chose que vous souhaitez conserver, copiez les résultats dans une liste de sauvegarde.
  3. Reportez-vous à la liste de sauvegarde lorsque vous souhaitez référencer une ligne précédente.
Questions connexes