Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2007, 09h43   #1
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
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 :
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 :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 10h35   #2
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
Bon pour ceux que ça intéresse j'ai trouvé comment faire une requête dynamique sous MySQL :

Code :
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 :
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 :
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
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 11h35   #3
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
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 :
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.
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 13h25   #4
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
Merci à toi, tres intéressant
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 14h17   #5
Nouveau Membre du Club
 
Avatar de Shinn77
 
Inscription : juin 2007
Messages : 51
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : juin 2007
Messages : 51
Points : 27
Points : 27
Envoyer un message via ICQ à Shinn77 Envoyer un message via MSN à Shinn77
De rien, ce fut un plaisir (rires)

Shinn77
Shinn77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h45.


 
 
 
 
Partenaires

Hébergement Web