|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 120 ![]() |
alors là les gars va falloir m'aider !!!!
j'ai une table contenant une correspondance entre une abréviation et sa valeur complete EX: RTE ------> ROUTE j'ai à côté une table client qui contient un champs adresse ayant énormément d'abréviation de ce type. Le but de ma procédure est de supprimé toutes ces abréviations dans le champs adresse CREATE PROCEDURE dedou_abrev2 () BEGIN DECLARE a VARCHAR(10); DECLARE b VARCHAR(50); DECLARE d VARCHAR(100); DECLARE c INT; DECLARE done INT DEFAULT 0; DECLARE cabrev CURSOR FOR select abreviations,correction from abreviation; DECLARE cadresse CURSOR FOR select adr1 from clients; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; open cabrev; open cadresse; repeat fetch cadresse into d; fetch cabrev into a,b; if not done then if a like concat(' ', left(d,2), ' ') then insert into test (test1) select adr1 from clients where d=adr1; end if; end if; UNTIL done end repeat; close cabrev; close cadresse; END // Pour réduire mon champs d'investigation d'erreurs j'ai créé une table test que je cherche à incrémenter de certaines valeurs liées à mes requêtes. La procédure se crée sans erreur mais par contre lors de son exécution il ne se passe rien Quelqu'un a t'il une idée concernant l'erreur de syntaxe que j'ai surement due commettre ? Merci d'avance |
|
|
00
|
|
|
#2 | ||
![]() Inscription : juillet 2002 Messages : 537 ![]() |
Es-tu sûr que la condition if a like concat(' ', left(d,2), ' ') est vraie pour des enregistrements ?
Je ne vois pas très bien l'utilité de ta procédure. Tu ne peux pas faire : Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 120 ![]() |
Merci biglo pour ta proposition mais non je ne peux pas car en faite la chaine abréviation peut etre n'importe ou dans la chaine adresse.
EX BD DE LA MER 73 BD de la plage j'ai fait évoluer ma procédure de la sorte: CREATE PROCEDURE dedou_abrev2 () BEGIN DECLARE a VARCHAR(100); DECLARE b VARCHAR(50); DECLARE d VARCHAR(100); DECLARE c VARCHAR(100); DECLARE done INT DEFAULT 0; DECLARE cabrev CURSOR FOR select abreviations,correction from abreviation; DECLARE cadresse CURSOR FOR select adr1 from clients; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; open cabrev; open cadresse; repeat fetch cadresse into d; fetch cabrev into a,b; if not done then set c =concat(' ', left(d,2), ' '); if a eq c then insert into test values (c); end if; end if; UNTIL done end repeat; close cabrev; close cadresse; END // J'ai aussi modifié la structure de mon test pour réduire le champs d'erreur Le fait de renvoyer le concat left dans une variable fonctionne très bien mais le soucis est la comparaison entre 2 éléments de 2 curseurs if a=c Car si je ne met pas la boucle if a=c et que je fais juste un insert de ma données stockées dans la variable c, ma procédure fonctionne Malheureusement le plus important est la définition de ce if. As-tu une idée d'où cela peut il venir ? Ne faut il pas introduire une comparaison de type 'eq' entre les 2 variables des curseurs ? |
|
|
00
|
|
|
#4 |
![]() Inscription : juillet 2002 Messages : 537 ![]() |
Ok je comprends mieux. Mais ce n'est pas plutôt cette condition que tu voulais mettre :
Là ça devrait marcher si l'adresse contient l'abréviation précédée et suivie d'un espace. Dans ton exemple "73 BD de la plage", ça devrait donc être OK. Par contre pour "BD DE LA MER", étant donné qu'il n'y a pas d'espace avant, ça n'irait pas et il faudrait donc faire une condition supplémentaire. |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 120 ![]() |
Justement tu pointes du doigt là ou j'en étais.
Mon idée étai celle ci et clients.adr1=REPLACE(d,a,b); else if a = concat(' ',left(d,2),' ') then update clients set clients.adr1=REPLACE(d,a,b); else if a = concat(' ',left(d,3),' ') then update clients set clients.adr1=REPLACE(d,a,b); else if a = concat(' ',left(d,4),' ') then update clients set clients.adr1=REPLACE(d,a,b) Mon problème étant que je n'arrivais pas à trouver la syntaxe exact de mon if? selon toi la bonne syntaxe serait if a like concat( '% ', LEFT(str,len),' %')? J'avoue que j'avais essayé mais sans les %, ca vient peut être de là!!! Si c'est le cas, pour information, à quoi servent t-ils? |
|
|
00
|
|
|
#6 |
![]() Inscription : juillet 2002 Messages : 537 ![]() |
En fait, je ne comprends pas très bien ce que tu veux faire avec tes LEFT.
Ce code veut dire : si " abreviation " est contenu dans l'adresse. % correspond à 0, 1 ou plusieurs caractères quelconques. Ce code renvoie vrai (1) car l'adresse est du bon format. Le premier % serait ici utilisé pour '73' et le deuxième pour 'de la plage'. Si tu veux savoir si une adresse contient une abréviation, c'est donc comme cela qu'il faut faire. Du moins, c'est une méthode (qui est assez simple). Si toutes tes abréviations sont précédées et suivies d'un espace, c'est facile. Tu fais le IF ci-dessus et dans le THEN, tu auras : Code :
UPDATE clients SET adr1 = REPLACE(adr1, CONCAT(' ', abreviation, ' '), CONCAT(' ', correction, ' ')) |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 120 ![]() |
Ton idée est interressante mais si dans le champs adresse j'ai:
PORTE DE LA PAPE En sachant bien sur que RTE est l'abréviation de ROUTE Si je me contente de ta solution en placant un IF pour dire: IF a like concat ('RTE', ' %') Il va me modifier le champs PORTE DE LA PAPE ----> POROUTE DE LA PAPE D'ou mon intérêt pour les LEFT car je sais que le champs "RTE" (que je veux changer) si il n'est pas entouré d'espace sera forcement en DEBUT du champs adresse !!!! JEU DE TEST: RTE DE PARIS PORTE DE LA PAPE 58 RTE DE MARSEILLE Dans les 1er et 3ème seulement le champs RTE doit être modifié. Dans les différentes procédures que j'ai crée, je sui capable de modifier le 3ème cas mais mon souhait est d'rrivée à modifier le premier cas. Pour ca je passe dans différente boucle de test et c'est là que j'ai mon soucis Pour résumer le test a est une chaine de caractère contenant ' RTE ' et qd j'ecrit set c=concat(' ',LEFT(d,3),' ') if a=c then insert into test values (c) end if c est ainsi une autre chaine de caractère contenant ' RTE ' (à un moment donné dans le jeu de test). D'ou l'égalité possible avec la valeur de a Il est incapable de comprendre l'instruction, hors si je fais sauter la boucle if set c=concat(' ',LEFT(d,3),' ') then insert into test values (c) Il m'insert correctement les valeurs prises par c (tout ceci est dans une boucle repeat until) OU EST LE PROBLEME AUTOUR DE MON IF? |
|
|
00
|
|
|
#8 | |
|
Membre du Club
![]() Inscription : novembre 2006 Messages : 120 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com