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 :

comment utiliser execute_array


Sujet :

SGBD Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut comment utiliser execute_array
    Bonjour,

    Quelqu'un saurait-il m'expliquer comment utiliser execute_array ? Je ne comprends pas et ne trouve aucun endroit où cela soit expliqué...

    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
     
    $sth = $dbh->prepare("INSERT INTO staff (first_name, last_name) VALUES (?, ?)");
      my $tuples = $sth->execute_array(
          { ArrayTupleStatus => \my @tuple_status },
          \@first_names,
          \@last_names,
      );
      if ($tuples) {
          print "Successfully inserted $tuples records\n";
      }
      else {
          for my $tuple (0..@last_names-1) {
              my $status = $tuple_status[$tuple];
              $status = [0, "Skipped"] unless defined $status;
              next unless ref $status;
              printf "Failed to insert (%s, %s): %s\n",
                  $first_names[$tuple], $last_names[$tuple], $status->[1];
          }
      }
    Je ne comprend pas comment ni où on doit insérer les valeurs que l'on souhaite donner à first_name et last_name...

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par cancrat Voir le message
    Bonjour,

    Quelqu'un saurait-il m'expliquer comment utiliser execute_array ? Je ne comprends pas et ne trouve aucun endroit où cela soit expliqué...
    Aucun endroit où ce soit expliqué ? Alors que tu cites l'exemple tiré de la documentation DBI juste après l'explication de execute_array() ? J'ai dû manquer un épisode.

    Je pense que ce que tu veux dire est que tu ne comprends pas comment utiliser execute_array() bien que tu ais lu la documentation, ce qui est à la fois dommage, et préférable (ça montre que tu as fais l'effort de chercher).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sth = $dbh->prepare("INSERT INTO staff (first_name, last_name) VALUES (?, ?)");
      my $tuples = $sth->execute_array(
          { ArrayTupleStatus => \my @tuple_status },
          \@first_names,
          \@last_names,
      );
    Il me semble que cet exemple n'est pas trop compliqué, pourtant : $sth est une requête INSERT avec deux placeholders (les "?"), execute_array() utilise les valeurs présentes dans les tableaux @first_names et @last_names pour effectuer la série de requête sur le modèle $sth (attention, les noms des tableaux n'ont pas d'importance, seuls l'ordre dans lequel ils sont donnés indique lequel correspond à first_name et à last_name).
    Le { Arra... } est une référence sur un hash d'option, ici ArrayTupleStatus est une option qui spécifie la référence du tableau dans lequel stocker les status de retour de chacune des requêtes de la série (erreur, réussite, message d'erreur...).

    Que ne comprends tu pas là dedans ?

    --
    Jedaï

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    Merci pour cette explication. Je ne comprenais pas ce qu'était les tuple_statut. Mon attention se focalisait là-dessus, le tout me semblait alors très obscur.

    Si je comprends bien, il n'est pas nécessaire de s'intéresser à cette option. On peut également récupérer les résultats des requêtes, si on veut utiliser execute_array() avec un SELECT plutôt qu'avec un INSERT. Il s'agit uniquement d'une méthode qui permet d'utiliser un prepared statement avec des valeurs rangées dans des tableaux. N'est-ce pas?

    L'intérêt est-il, comme pour prepare_cached, de ne préparer la requête qu'une seule fois pour toute?

    En fait j'utilise Perl pour manipuler une base de données pour la première fois depuis longtemps (j'ai fait ça en Java et en PHP ces derniers temps) et je suis surprise par la lenteur d'exécution de mes scripts.

    Pour l'instant mon code ressemble à ça:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    foreach $lexique(@lexique)
    {
    	chomp $lexique;
    	@ligne = split('\t ',$lexique);
     
    	#échapper les chaînes comprises dans la requête
    	$toto = $dbh->quote(@ligne[1]);
     
    	#vérification de l'existence de la forme dans la base de données
    	#définition de la requête
    	$requete="SELECT ID FROM matable WHERE contenu=$toto";
     
    	#préparation de la requête
    	$sth = $dbh ->prepare($requete);
     
            #exécution de la requête
    	$sth->execute; 
     
            #si l'enregistrement n'existe pas, je le crée
    	if ($sth->rows == 0) {
    		#insertion dans la base de donnée
    		#définition de la requête
    		$requete="INSERT INTO matable (contenu) VALUES ($toto)";
     
    		#préparation de la requête et exécution de la requête
    		$dbh ->do($requete);
    	}
     
    	#spécifier la fin de la requête
    	$sth->finish;
     
    }
    et pour un lexique de 620 535 entrées, prend plus de 12 heures à s'exécuter

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    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
    22
    23
    24
    25
    26
    #vérification de l'existence de la forme dans la base de données
    #préparation de la requête
    my $select = $dbh->prepare("SELECT ID FROM matable WHERE contenu=?");
     
    #insertion dans la base de donnée
    #préparation de la requête
    my $insert = $dbh->prepare("INSERT INTO matable (contenu) VALUES (?)");
     
    chomp @lexique;
    # je soupçonne que @lexique provient d'un fichier, pourquoi ne
    # pas plutôt faire une lecture ligne à ligne ? Cela pourrait être
    # un des problèmes de ton script
    foreach my $lexique (@lexique) {
       my $toto = (split '\t ',$lexique)[1];
     
       #exécution de la requête
       $select->execute($toto); 
     
       #si l'enregistrement n'existe pas, je le crée
       if ($select->rows == 0) {
          $insert->execute($toto);
       }
    }
     
    #spécifier la fin de la requête
    $select->finish;
    --
    Jedaï

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 09h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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