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 :

aide pour une procédure


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 88
    Points
    88
    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

  2. #2
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE clients, month SET clients.adr = abreviation.correction 
    WHERE clients.adr = abreviation.abreviations;
    ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    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 ?

  4. #4
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Ok je comprends mieux. Mais ce n'est pas plutôt cette condition que tu voulais mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    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?

  6. #6
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    En fait, je ne comprends pas très bien ce que tu veux faire avec tes LEFT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    '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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    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?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    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?

Discussions similaires

  1. [2012] Aide pour une procédure
    Par LiTiL_DiViL dans le forum Développement
    Réponses: 3
    Dernier message: 25/08/2013, 21h12
  2. Aide pour une procédure stockée
    Par winnyzeboss1 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 19/04/2011, 20h53
  3. aide pour une procédure
    Par flowneo dans le forum Débuter
    Réponses: 1
    Dernier message: 12/11/2009, 09h59
  4. Aide pour une procédure stockée
    Par shirya dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/03/2007, 08h48
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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