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 07/11/2006, 15h21   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Par défaut aide pour une procédure

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
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 17h46   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
1
2
UPDATE clients, month SET clients.adr = abreviation.correction 
WHERE clients.adr = abreviation.abreviations;
?
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 17h58   #3
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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 ?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 18h14   #4
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Ok je comprends mieux. Mais ce n'est pas plutôt cette condition que tu voulais mettre :

Code :
IF d LIKE CONCAT('% ',  a, ' %')
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.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 18h35   #5
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 20h50   #6
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
En fait, je ne comprends pas très bien ce que tu veux faire avec tes LEFT.

Code :
IF d LIKE CONCAT('% ', a, ' %')
Ce code veut dire : si " abreviation " est contenu dans l'adresse.

% correspond à 0, 1 ou plusieurs caractères quelconques.

Code :
'73 BD de la plage' LIKE '% BD %'
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, ' '))
Après, si tu peux avoir un espace après l'abréviation mais pas avant, comme dans une adresse sans numéro, il faut faire un autre IF sans l'espace de début . Idem pour le UPDATE qui suit.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2006, 09h55   #7
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
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?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2006, 09h57   #8
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Citation:
Envoyé par beberd
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 '
d étant le champs du curseur contenant l'adresse

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?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web