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

SQL Procédural MySQL Discussion :

procédure et insert multiple


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Par défaut procédure et insert multiple
    Bonjour,

    J'ai une procédure dans laquelle une requête de sélection parse une table, réalise une extraction, puis écrit les résultats dans une autre table.
    Actuellement, pour chaque résultat, je génère une requête "insert into". Je trouvais pas ça très optimisé, dans le cas ou je dépassais un certain nombre de résultats, autant réaliser un insert multiple.

    En l'occurence, je ne vois pas trop comment le réaliser vu que je génère l'intégralité de la requête à la volée.

    Voici le code de la procédure :

    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
    33
    34
    35
    36
    37
    38
    39
    CREATE PROCEDURE CREATE_BRANDS()
    BEGIN 
      /**
       * Flag : définit la fin de la lecture de la table CONTENT.
       */
      DECLARE done INT DEFAULT 0;
      /**
       * Variable MYBRANDS
       * Liste les marques.
       */
      DECLARE myBrand VARCHAR(35);
      /**
       * Création d'un curseur pour lecture de la table CONTENT.
       * Ce curseur stocke l'ensemble des marques.
       */
      DECLARE BRANDCURSOR CURSOR FOR SELECT BRAND FROM CONTENT GROUP BY BRAND; 
      /**
       * Gestionnaire de fin d'exécution du traitement de la requête.
       */
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
      /**
       * Ouverture du curseur.
       */
      OPEN BRANDCURSOR; 
      /**
       * Lit les résultats tant que done = 1, les écrits dans la marque.
       */
      REPEAT
        FETCH BRANDCURSOR INTO myBrand;
    	IF done = 0 THEN 
    		INSERT INTO BRAND (LIBELLE) VALUES (myBrand) ON DUPLICATE KEY UPDATE LIBELLE = myBrand;
    	END IF;
      UNTIL done
      END REPEAT;
      /**
      * Fermeture du curseur.
      */
      CLOSE BRANDCURSOR;
    END
    On constate que dans mon FETCH, pour chaque résultat je génère une requête. Comment faire pour générer une seule requête d'insertion (multi insert) dans ce cas précis ?

    Merci beaucoup de votre aide !

    M.

  2. #2
    Membre chevronné
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il te suffit de faire un CONCAT dans la boucle avec ton curseur sur le/les champ(s) a extraire, et de construire ta requête statique générée à la volée, puis l'executer via une requête préparée (tu n'as pas le choix en MySQL).

  3. #3
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    en faisant attention à la taille que ça représente en fonction du type de variable que tu vas utiliser

    text te permet 65k par exemple... donc il faut faire gaffe à ça en choisissant le type si tu utilises une variable locale (le moins gourmand)...sinon si tu utilises une variable globale (genre @t) tu ne te poseras pas le soucis de la contenance et du type...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    J'ai l'impression qu'une simple requête INSERT SELECT ferait l'affaire !

    D'autre part...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE BRANDCURSOR CURSOR FOR SELECT BRAND FROM CONTENT GROUP BY BRAND
    GROUP BY s'utilise avec des fonctions de groupage dans le SELECT. Ici, vous n'en avez pas. Utilisez plutôt DISTINCT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO BRAND (LIBELLE) VALUES (myBrand) ON DUPLICATE KEY UPDATE LIBELLE = myBrand;
    Quelle est la clé primaire de la table BRAND ?
    Si c'est une clé entière auto-incrémentée, votre INSERT ne fera jamais de DUPLICATE KEY.
    Si c'est LIBELLE, c'est une mauvaise clé !

    Cette requête ne répondrait-elle pas à votre besoin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO BRAND (LIBELLE)
    SELECT DISTINCT BRAND
    FROM CONTENT
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    oui cinéphil à raison, vu qu'il n'y a pas plusieurs insert ou update dans la boucle de ton curseur ou de récursion, ton code revient à un simple insert...select

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si c'est LIBELLE, c'est une mauvaise clé !
    J'ai l'impression que c'est le cas...
    Il faut juste qu'il ajoute IGNORE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT IGNORE INTO BRAND (LIBELLE)
    SELECT DISTINCT BRAND
    FROM CONTENT

Discussions similaires

  1. [2008] Procédure stockée et multiples insert
    Par Guigsounet dans le forum Développement
    Réponses: 6
    Dernier message: 27/11/2014, 10h42
  2. procédure stockée insert multiple
    Par gigi34 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2005, 10h37
  3. [Procédure stockée]Insert avec renvoi clé primaire?
    Par busmik dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/08/2004, 16h14
  4. pb d'insertions multiples
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 14/07/2004, 14h49
  5. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34

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