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 :

Mise à jour de valeur avec SUBSTRING


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut Mise à jour de valeur avec SUBSTRING
    Je souhaite mettre à jour un champs d'une table en utilisant la première partie des valeurs d'un autre champs de la même table. Les parties de ce deuxième champs sont espacés par un <espace>
    Aussi, j'ai testé la requête suivante:
    UPDATE NOM_TABLE
    SET CHAMPS1 = SUBSTRING (CHAMPS2, 1, Position (' ' IN CHAMPS2))


    Or MySql me retourne une erreur de syntaxe

    Losque que je teste la requête soeur qui est
    Select SUBSTRING (CHAMPS2, 1, Position (' ' IN CHAMPS2)) FROM NOM_TABLE

    MySql me retourne les bonnes valeurs.
    Est ce que la fonction SUBSTRING n'est pas utilisable pour mettre à jour des champs ?

    Merci de votre réponse

  2. #2
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    dans ton UPDATE, essaye de dire la ligne que tu veux UPDATER

    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE tatable
    SET ce que tu veux
    WHERE id = 'un id';

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    Merci pour cette demande de précision.

    La requête que j'essaye de faire marcher est basée sur l'extraction d'une partie d'une chaîne de caratère basée sur :
    UPDATE NOM_TABLE
    SET CHAMPS1 = SUBSTRING (CHAMPS2, 1, Position (' ' IN CHAMPS2))

    Mais cela ne marche pas.

  4. #4
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    moi ce que je fais dans ces cas la c'est que je fait un curseur pour ma table et que je fait le traitement pour chaque ligne au lieu d'essayer de le faire pour la colonne en entier d'un coup.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    En fait, je n'ai jamais utilisé de curseur.
    Serait'il possible d'avoir une exemple basé sur la requête que j'ai écrite dans ma demande ?

  6. #6
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    je te donne un exemple mais j'ai pas trop le temps de l'adapter a ton cas desole

    j'utilise une proc stocké de ce style :

    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
    DROP PROCEDURE IF EXISTS PRC_TA_PROC;
    
    CREATE PROCEDURE PRC_TA_PROC ()
    
    BEGIN
    
    DECLARE v_cur_done INT;
    
    DECLARE curseur CURSOR FOR 
      SELECT  id, ... tes champs
      FROM    ta table;
    
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' 
        SET v_cur_done = 1;
    
    SET v_cur_done=0;
    
    -- Ouverture du curseur 
      OPEN curseur;
      
      FETCH   curseur 
          INTO  tes variables de curseur que tu auras declaré;
    
     -- Pour chaque enregistrement
      WHILE NOT v_cur_done DO
    
            fait ce que tu veux ici
    
    
        FETCH   curseur 
          INTO  tes variables de curseur que tu auras declaré;
          
      END WHILE; -- Fin 'Pour chaque enregistrement'
    
      -- Fermeture du curseur 
      CLOSE curseur ;
    
    END;
    Si j'ai le temps ce soir j'essaierai de l'adapter a ton cas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    J'ai une table avec 3 champs qui sont le CODE (clé primaire), NOM et PRENOM.
    Le problème est que le nom et le prénom sont concaténé dans le même champ, c'est à dire dans le NOM.
    Le but est d'éclater les informations figurant dans nom en prenant le prenom (espacé par un <espace>) et l'enregistrer dans le champ PRENOM.
    Ensuite il faut ensuite effacer la partie correspondante au prénom qui se trouve dans le champ NOM

    CODE....NOM.......................PRENOM
    .....1.........NOM1 Prénom1
    .....2.........NOM2 Prénom2
    .....3.........NOM3 Prénom3
    .....4.........NOM4 Prénom4
    .....5.........NOM5 Prénom5
    .....6.........NOM6 Prénom6

    J'y joints le fichier contenant les valeurs correspondant à la description ci dessus.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    On va dire que ta table s'apelle TOTO


    essaye ca :


    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
    45
    46
    47
    48
    49
    50
    51
    DROP PROCEDURE IF EXISTS PRC_TA_PROC;
     
    CREATE PROCEDURE PRC_TA_PROC ()
     
    BEGIN
     
    DECLARE v_cur_done INT;
     
    DECLARE v_cur_code INT;
    DECLARE v_cur_nom VARCHAR(255);
    DECLARE v_pos_espace INT;
    DECLARE v_longueur INT;
    DECLARE v_nom VARCHAR(255);
    DECLARE v_prenom VARCHAR(255);
     
    DECLARE curseur CURSOR FOR 
      SELECT  code, nom
      FROM    TOTO;
     
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' 
        SET v_cur_done = 1;
     
    SET v_cur_done=0;
     
    -- Ouverture du curseur 
      OPEN curseur;
     
      FETCH   curseur 
          INTO  v_cur_code, v_cur_nom;
     
     -- Pour chaque enregistrement
      WHILE NOT v_cur_done DO
     
          SET v_pos_espace = LOCATE(' ', v_cur_nom);
          SET v_longueur = LENGTH(v_cur_nom);
          SET v_nom = SUBSTRING(v_cur_nom, 1, v_pos_espace);
          SET v_prenom = SUBSTRING(v_cur_nom, v_pos_espace, (longueur - v_pos_espace));
     
          UPDATE TOTO
          SET nom= v_nom, prenom= v_prenom
          WHERE code = v_cur_code;
     
        FETCH   curseur 
          INTO  v_cur_code, v_cur_nom;
     
      END WHILE; -- Fin 'Pour chaque enregistrement'
     
      -- Fermeture du curseur 
      CLOSE curseur ;
     
    END;
    desole si ca marche pas mais j'avais pas trop le temps


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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/07/2006, 09h39
  2. [PHP-JS] Mise à jour de frames avec Javascript
    Par GLDavid dans le forum Langage
    Réponses: 10
    Dernier message: 31/05/2006, 10h49
  3. Réponses: 6
    Dernier message: 29/05/2006, 14h22
  4. Réponses: 3
    Dernier message: 15/11/2005, 18h50
  5. Problème de mise à jour de données avec IBClientDataset
    Par Papino dans le forum Bases de données
    Réponses: 6
    Dernier message: 26/09/2005, 14h04

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