IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

renvoyer resultat requete dans tableau hash


Sujet :

SGBD Perl

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut renvoyer resultat requete dans tableau hash
    Bonjour à tous.

    Je souhaite savoir comment je pourrais renvoyer des résultats d'une requete contenu dans une fonction dans un tableau de hash.
    Puis retourner ces valeurs dans un programme principal.

    Ci-joint mon exemple de code:




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    #declaration de mon tableau en hash
    my %perimstatus=('migration' => '$migration',
    				 'perimetre'=> '$perimetre');
     
     
    sub mafonction
    {
    	my  $prep=$connection->prepare("select migration, perimetre_proxyma from personnes where utilisateur=?;");
    	$prep->execute(test) or die 'impossible d exécuter la requête : ';
     
            #ici je place le résultat dans un tableau, mais je souhaiterai mettre ça dans un tableau en hash
            my @perimstatus= $prep->fetchrow_array;
     
    		# ici je souhaiterai retourner mon tableau de hash au programme principal.
    }
     
    #programme principal ..
    Je vous remercie

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    tu veux parler de fetchall_hashref ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut re
    effectivement ça semble coller à mon souhait par contre je suis pas sur de l'utilisation.
    J'ai quelques erreurs à l'exécution.

    J'ai tenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    #declaration de mon tableau hash
    my %perimstatus;
     
    sub perimetre
    {
    	my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
    	$prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
    	#déja ici j'ai des erreurs
    	$perimstatus=$prep->fetchall_hashref($retourrequette_migration,$retourrequete_perimetre);
     
     
     
     
    	$prep->finish();
     
    }
    #appel de la fonction
    	perimetre($personne);

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    tu ne te sers pas correctement de fetchall_hashref

    premièrement il te faut indiquer quelle colonne dans tes résultats sql servira de clé pour chaque ligne de résultats.

    si tu ne t'attends qu'à une seule ligne, alors fetchrow_hashref me semble plus adapté, tu auras ta ligne sous la forme d'un hash de la forme nom_de_colonne => valeur

    consulte bien la doc pour les détails et les paramètres

    ensuite c'est juste une question de référence. tu auras dans les 2 cas une référence à un hash, donc pour modifier ton hash il te suffit de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    my %perimstatus;
    sub perimetre
    {
    	my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
    	$prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
    	#déja ici j'ai des erreurs
    	%perimstatus= %{$prep->fetchrow_hashref()}; # la fonction renvoie une référence, que tu déréférences en hash.
     
      	# $prep->finish(); # en général inutile
     
    }
    #appel de la fonction
    perimetre($personne);
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    J'ajoute aux conseils de Gardyen qu'il est rarement souhaitable d'utiliser des variables globales que l'on modifie directement dans une fonction (le hash %perimstatus dans ce cas).

    En reprenant la version de ton code corrigée par Gardyen, il est sans doute préférable d'écrire quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my %perimstatus = perimetre($personne);
    sub perimetre
    {
    	my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
    	$prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
    	my %perim = %{$prep->fetchrow_hashref()}; # la fonction renvoie une référence, que tu déréférences en hash.
            return %perim; # ceci ne marche plus quand on doit renvoyer deux tables de hachages ou deux tableaux
    }
    A noter que la dernière ligne avec le return n'est pas indispensable car une fonction renvoie par défaut la dernière expression évaluée, mais je préfère le mettre explicitement pour bien clarifier.

    On peut aussi déréférencer le hash ref à la sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my %perimstatus = %{perimetre($personne)};
    sub perimetre
    {
    	my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
    	$prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
    	my $perim_ref = $prep->fetchrow_hashref(); # je vais renvoyer la référence
            return $perim_ref; 
    }
    Si les données risquent d'être volumineuses, il peut être souhaitable d'utiliser une hash ref pour éviter de copier inutilement les données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    my $perimstatus_ref = perimetre($personne); # c'est maintenant un hash_ref, il faut déréférencer $perimstatus_ref pour utiliser le contenu
    sub perimetre
    {
            my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
            $prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
            my $perim_ref= $prep->fetchrow_hashref(); 
            return $perim_ref;
    }
    ou encore créer le hash et utiliser un hash ref dans la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my %perimstatus;
    perimetre(\%perimstatus); # Passe à la fonction une hash ref. La variable $personne n'étant apparemment pas utilisée dans la fonction, je la vire des arguments 
    sub perimetre
    {
            my $perim_ref = shift;
    	my  $prep=$connect->prepare("select migration, perimetre from personnes where personnes=?;");
    	$prep->execute($personnes) or die 'impossible d exécuter la requête : ';
     
            $perim_ref= $prep->fetchrow_hashref(); 
    }
    Mais j'aime moins cette dernière version, car elle masque l'utilisation de variables globales plus qu'elle ne l'évite vraiment. D'une façon générale, il est préférable qu'une fonction renvoie les valeurs qu'elle détermine, met à jour ou calcule, et qu'elle reçoive en argument celles qu'elle utilise. Cela dit, il m'arrive (mais de moins en moins souvent) de faire des exceptions pour diverses raisons (performance, simplicité du code, etc.), mais uniquement dans des programmes simples où il est facile de voir ce qui se passe d'un seul coup d’œil.

    Un dernier point: il est généralement plus clair à mes yeux de regrouper les fonctions à la fin du code, pour que le code principal ne soit pas entrecoupé par des définitions de fonction. Mais c'est surtout une affaire de goût personnel.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut re
    un grand merci pour vos explications.

    Je vais reprendre le cours concernant le passage de référence des variables pour bien saisir.
    C'est très formateur de prendre le temps de m'expliquer plutôt qu'avoir une simple réponse et je vous en remercie.

    Je n'ai pas accès a mon code durant ce week-end ce qui est dommage, je testerai ça début de semaine prochaine et vous ferai signe

    Merci beaucoup je pense que le débutant que je suis n'a pas finit d'y passer des heures, mais je trouve ça passionnant !

    bon week-end à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Resultat requete dans un combobox
    Par fixfix dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/02/2007, 13h53
  2. Export resultat requete dans CSV et XLS ?
    Par wormseric dans le forum Oracle
    Réponses: 14
    Dernier message: 20/09/2006, 16h36
  3. Resultat requete dans un memo ??
    Par EssaiEncore dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/01/2006, 15h53
  4. Resultat requete dans zone de texte
    Par htaM dans le forum Access
    Réponses: 5
    Dernier message: 29/09/2005, 14h43
  5. Resultat requete dans une seule colonne
    Par mathieu--g dans le forum Sybase
    Réponses: 2
    Dernier message: 08/07/2003, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo