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 :

[MySQL5] Procédures Stockées de Mise à jour


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut [MySQL5] Procédures Stockées de Mise à jour
    Bonjour tout le monde,

    dans le cadre d'un site perso, j'utilise la base de données MySQL 5.

    Pour ajouter, modifier, supprimer mes tables de ma base de données, je passe par des Procédures Stockées.

    J'aimerai vous demander votre avis pour les procédures stockées de mises à jour.

    Par exemple :
    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
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spU_ModifierArashiChanteur` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spU_ModifierArashiChanteur`(
      p_Nom              varchar(50),
      p_Prenom           varchar(50),
      p_Surnom           varchar(80),
      p_DateNai          varchar(10),
      p_VilleNai         varchar(150),
      p_PaysNai          varchar(50),
      p_Biographie       text
    )
    BEGIN
      UPDATE ArashiChanteur
      SET
        Nom                =    UPPER(TRIM(p_Nom)),
        Prenom             =    Ucfirst(TRIM(p_Prenom)),
        Surnom             =    Ucfirst(TRIM(p_Surnom)),
        DateNai            =    STR_TO_DATE(p_DateNai, '%d/%m/%Y'),
        VilleNai           =    Ucfirst(TRIM(p_VilleNai)),
        PaysNai            =    UPPER(TRIM(p_PaysNai)),
        Biographie         =    Ucfirst(TRIM(p_Biographie))
      WHERE id = p_id;
    END $$
     
    DELIMITER ;
    Dans cette procédure stockée, je met donc à jour ma table ArashiChanteur avec les données reçues en paramètres.

    Seulement, ce qui m'intéresserait c'est de ne mettre à jour QUE ce que je veux.

    Par exemple je veux mettre à jour que la Ville de Naissance.

    J'aimerai pouvoir faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CALL Proc_spU_ModifierArashiChanteur ('', '', '', '', 'Tokyo', '', '');
    En exécutant la procédure stockée de la façon comme suit j'aimerai qu'il ne mette à jour QUE la ville car les autres paramètres, il a reçut des champs vide.

    Je pourrais faire cela via de multiple IF THEN ELSE IF END IF...
    Mais cela pourrait être long, fastidieux et moche.

    Y'a-t'il une façon plus propre de construire ma requête dynamiquement afin qu'il ne mette à jour QUE les champs renseigner dans les paramètres (où la valeur est différent de vide) ?

    EDIT : Sur SQL Server j'utilisais les requêtes dynamiques (construire une chaine qui contient ma requete et que je construis selon des conditions, puis une fois terminée, lancer ma requete). Y'a un équivalent en MySQL ??

    Merci de me donner votre avis sur la question.


    Shinn77, Till the End of Time

  2. #2
    Membre averti Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Bon pour ceux que ça intéresse j'ai trouvé comment faire une requête dynamique sous MySQL :

    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
    40
    41
    42
    43
    44
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spU_ModifierNews` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spU_ModifierNews`(
      p_id              int,
      p_Titre           varchar(125),
      p_Message         text
    )
    BEGIN
     
      -- Début de la requête
      SET @stmt := CONCAT('UPDATE News SET DateModification = ?, ');
     
      -- Si le Titre a été renseigné
      IF (p_Titre != '') THEN
        SET @stmt := CONCAT(@stmt, 'Titre = ?, ');
      END IF;
     
      -- Si le Nom a été renseigné
      IF (p_Message != '') THEN
        SET @stmt := CONCAT(@stmt, 'Message = ?, ');
      END IF;
     
      SET @stmt := CONCAT(SUBSTR(@stmt, 1, LENGTH(@stmt) - 2)," ");
     
      -- Fin de la requête
      SET @stmt := CONCAT(@stmt, 'WHERE id = ?;');
     
     
      -- On renseigne les variables avec les paramètres reçu
      SET @id       :=  p_id;
      SET @Titre    :=  TRIM(p_Titre);
      SET @Message  :=  TRIM(p_Message);
     
      -- On prépare le stmt avec @stmt qui contient notre requête
      PREPARE stmt FROM @stmt;
      -- On exécute donc la requête
      EXECUTE stmt;
      -- On supprime le stmt
      DEALLOCATE PREPARE stmt;
    END $$
     
    DELIMITER ;
    Avec cette procédure stockée, quand je l'exécute comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CALL Proc_spU_ModifierNews (1, 'Changement de Titre', '');
    Ca change QUE le titre, et ne touche pas au message.

    De même, si on lance comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CALL Proc_spU_ModifierNews (1, '', 'Changement du message');
    Ca ne change QUE le message.
    On a donc une création dynamique de la requête.

    Bon ici y'a que 2 champs donc pas grand intérêt mais si j'avais 6 champs ca serait beaucoup plus propre que 150 IF...


    Y'a t il une autre façon d'après vous pour faire cela plus propre ?

    Merci,

    Shinn77, Till the End of Time

  3. #3
    Membre averti Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    Bon finalement j'ai trouvé bien plus simple en utilisant :
    - COALESCE(a, b) : si a = null, alors b, sinon a
    - NULLIF(a, b) : si a = b, alors null, sinon a

    et j'obtient :
    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
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `web75-shinn77`.`Proc_spU_ModifierNews` $$
    CREATE DEFINER=`web75-shinn77`@`%` PROCEDURE `Proc_spU_ModifierNews`(
      p_id              int,
      p_Titre           varchar(125),
      p_Message         text
    )
    BEGIN
      UPDATE News
      SET
        DateModification = NOW(),
        Titre = COALESCE(NULLIF(p_Titre, ''), Titre),
        Message = COALESCE(NULLIF(p_Message, ''), Message)
      WHERE id = p_id;
    END $$
     
    DELIMITER ;
    Explication pour Titre = COALESCE(NULLIF(p_Titre, ''), Titre), :
    1/ Si p_Titre est égal à vide alors p_Titre = null (NULLIF)
    2/ Si p_Titre est égal à null alors on reprend la valeur de Titre sinon la valeur de p_Titre (COALESCE)

    Ca fait exactement comme avant mais en 150 fois plus simple lol

    Bon merci

    Je met le post en Résolu


    Shinn77, Till the End of Time.

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Par défaut
    Merci à toi, tres intéressant

  5. #5
    Membre averti Avatar de Shinn77
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut
    De rien, ce fut un plaisir (rires)

    Shinn77

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

Discussions similaires

  1. [SQL SERVER] Procédures stockées et mise en oeuvre de vues
    Par boby2600 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2006, 09h13
  2. Mysql5, Procédure stockée et PDO::LastInsertId()
    Par Philsmile dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 10/04/2006, 13h59
  3. [MySQL5] Procédure Stockée et RollBack
    Par filouxera dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 12/03/2006, 19h12
  4. Procedure Stocké et mise à jour de ligne
    Par Andry dans le forum SQL
    Réponses: 2
    Dernier message: 26/11/2004, 10h22
  5. Procedure stockée de mise à jour
    Par Cambon dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 20h35

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