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/05/2007, 23h17   #1
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 74
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 74
Points : 31
Points : 31
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
AODRENN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 15h25   #2
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
dans ton UPDATE, essaye de dire la ligne que tu veux UPDATER

du style
Code :
1
2
3
4
UPDATE tatable
SET ce que tu veux
WHERE id = 'un id';
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 15h50   #3
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 74
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 74
Points : 31
Points : 31
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.
AODRENN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 16h07   #4
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
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.
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 16h59   #5
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 74
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 74
Points : 31
Points : 31
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 ?
AODRENN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 17h40   #6
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
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 :
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
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 20h33   #7
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 74
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 74
Points : 31
Points : 31
Merci pour ton aide
AODRENN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 09h09   #8
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
si tu veux qu'on adapte le code a ta table donne nous un exemple de ta table avec le nom des champs, quelques valeurs et ce que tu veux .

merci
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h43   #9
Nouveau Membre du Club
 
Inscription : août 2005
Messages : 74
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 74
Points : 31
Points : 31
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
Type de fichier : txt nom_prenom.txt (119 octets, 1 affichages)
AODRENN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 17h33   #10
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
On va dire que ta table s'apelle TOTO


essaye ca :


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
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

pop_up 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 19h36.


 
 
 
 
Partenaires

Hébergement Web