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 :

Modification d'une procédure


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut Modification d'une procédure
    bonjour, j'ai une procédure qui me permet de récupérer des données depuis une table "import" pour les intégrer dans ma base de données.
    Aujourd'hui on m'a apporté des fichiers complémentaires pour cette base de données.
    Une fois remontés dans la table import j'ai voulu lancé la procédure et ça n'a pas marché et ça m'affiche le message d'erreur suivant "#1062 - Duplicate entry '547671-13-0' for key 'PRIMARY'".

    Il faudrait donc que je rajoute dans ma procédure que si l'entrée existe déjà on l'écrase.

    ma procédure est la suivante
    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
    DELIMITER |
     
    DROP PROCEDURE IF EXISTS import_donnees|
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER)
     
    BEGIN
     
    DECLARE iter INTEGER DEFAULT 0; 
     
    iterwhile: WHILE iter <= nbCapteur DO 
     
      SET @myInsert:= CONCAT('
    INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    FROM import i
    INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    WHERE i.`',iter,'` <>"(null)"');
     
     
      prepare stmnt FROM @myInsert; 
      EXECUTE stmnt; 
      DEALLOCATE PREPARE stmnt;
     
     
       SET iter = iter + 1; 
    END WHILE iterwhile;
    END |
    je essayer avec ON DUPLICATE KEY UPDATE IF EXIST

    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
    DELIMITER |
     
    DROP PROCEDURE IF EXISTS import_donnees|
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER)
     
    BEGIN
     
    DECLARE iter INTEGER DEFAULT 0; 
     
    iterwhile: WHILE iter <= nbCapteur DO 
     
      SET @myInsert:= CONCAT('
    INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    FROM import i
    INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    WHERE i.`',iter,'` <>"(null)"')
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale
                                    AND i.id_capteur=r.id_station_Stations;
     
     
      prepare stmnt FROM @myInsert; 
      EXECUTE stmnt; 
      DEALLOCATE PREPARE stmnt;
     
     
       SET iter = iter + 1; 
    END WHILE iterwhile;
    END |
    mais ça ne marche pas, alors que sur une ligne ça marche nickel si vous pouvez me dire ou je fait l'erreur merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Pourquoi IF EXISTS ? C'est un pléonasme avec ON DUPLICATE KEY !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    Pourquoi IF EXISTS ? C'est un pléonasme avec ON DUPLICATE KEY !
    Vi j'etais en train de modifier quand tu es passé, j'ai compris l'erreur j'ai essayer avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale
                                    AND i.id_station=r.id_station_Stations;
    mais pareil ça ne marche pas quand même

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Regarde le dernier exemple donnée dans la doc MySQL :
    Citation Envoyé par MySQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO table (a,b,c) VALUES (1,2,3)
      ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
    Il faut une virgule entre les instructions de mise à jour, comme dans une requête UPDATE.

    AND est un opérateur booléen. Il ne signifie pas "ET" au sens grammatical.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    ok,

    Ce que je ne comprend pas c'est que je voudrais qu'on remplace les lignes existantes quand l'id_station, id_date_heure et l'id_capteur sont les mêmes
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, i.id_station=r.id_station_Stations, id_capteur_capteur=id_capteur_capteur;
    mais ça ne marche pas ça me dit que j'ai une erreur de syntax

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Redonne ton code complet.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    ok, tout de suite j'en suis arrivé la mais apparemment j'ai une erreur de syntaxe

    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
    DELIMITER |
     
    DROP PROCEDURE IF EXISTS import_donnees|
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER)
     
    BEGIN
     
    DECLARE iter INTEGER DEFAULT 0; 
     
    iterwhile: WHILE iter <= nbCapteur DO 
     
      SET @myInsert:= CONCAT('
    INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    FROM import i
    INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    WHERE i.`',iter,'` <>"(null)"')
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, 
    i.id_station=r.id_station_Stations, 
    id_capteur_capteur=id_capteur_capteur;
     
     
      prepare stmnt FROM @myInsert; 
      EXECUTE stmnt; 
      DEALLOCATE PREPARE stmnt;
     
     
       SET iter = iter + 1; 
    END WHILE iterwhile;
    END |

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Tu n'as pas inclus le ON DUPLICATE KEY dans le texte de la requête préparée. Normal ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    Tu n'as pas inclus le ON DUPLICATE KEY dans le texte de la requête préparée. Normal ?
    j'ai l'impression que je vais dire une grosse connerie mais si il est juste après la requête, je te met juste le passage ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    FROM import i
    INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    WHERE i.`',iter,'` <>"(null)"')
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, 
    i.id_station=r.id_station_Stations, 
    id_capteur_capteur=id_capteur_capteur;

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Je ne suis pas un spécialiste des procédures mais je crois quand même qu'effectivement tu dis une grosse connerie !

    En indentant correctement ton code, tu verras mieux :
    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
    SET @myInsert:= 
    CONCAT
    ('
    	INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    	SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    	FROM import i
    	INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    	WHERE i.`',iter,'` <>"(null)"
    ')
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, 
    i.id_station=r.id_station_Stations, 
    id_capteur_capteur=id_capteur_capteur;
    Ne faudrait-il pas plutôt écrire ceci ?
    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
    SET @myInsert:= 
    CONCAT
    ('
    	INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    	SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    	FROM import i
    	INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    	WHERE i.`',iter,'` <>"(null)"
    	ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, 
    		i.id_station=r.id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    ');
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    ha oui ok, la ponctuation ça me rappel le primaire, j'ai jamais aimé les points, les virgules et autres billevesées lol

    Je n'ai plus d'erreur de syntaxe maintenant j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1054 - Unknown column 'i.date_heure' in 'field list'


    Alors qu'elle existe bien cette colonne c'est sur ???

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    i est l'alias de la table import et dans ton instruction ON DUPLICATE KEY, c'est celle que tu souhaites mettre à jour alors que l'INSERT est fait sur la table relever_mesure.

    MySQL cherche la colonne dans la table de l'INSERT et n'y trouve pas la colonne.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    holala je craques donc si j'ai bien compris en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ON DUPLICATE KEY UPDATE i.date_heure=c.date_heure_locale, 
    		i.id_station=r.id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    je cherche a mettre a jours la table import, alors que je cherche en fait a mettre a jours la table relever_mesure...
    donc si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ON DUPLICATE KEY UPDATE r.id_calendrier_calendrier=c.date_heure_locale, 
    		r.id_station_stations=station.id_station, 
    	id_capteur_capteur=id_capteur_capteur
    je devrais mettre a jours la table relever_mesure, mais c'est encore pire

    Bon je repars dans les cours parce que la ça va pas du tout, Je comprend plus rien, je vais devenir chèvre ...

  14. #14
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    mais c'est encore pire
    Symptômes ?

    À part quelques bêlements ?

    Visiblement, il manque des alias dans ton dernier ON DUPLICATE KEY.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    je te met le message d'erreur

    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
    Erreur
    Requête SQL: 
     
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER ) BEGIN DECLARE iter INTEGER DEFAULT 0;
     
    iterwhile : WHILE iter <= nbCapteur DO SET @myInsert := CONCAT(
     
    '
    	INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    	SELECT i.`',
    iter,
    '`,
           c.id_calendrier,
           i.id_station,
           ',
    iter,
    ' 
    	FROM import i
    	INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    	WHERE i.`',
    iter,
    '` <>"(null)"
    	ON DUPLICATE KEY UPDATE id_calendrier_calendrier=id_calendrier_calendrier, 
    		id_station_Stations=id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    '
    );
     
    prepare stmnt FROM @myInsert ;
     
    EXECUTE stmnt;
     
    DEALLOCATE PREPARE stmnt;
     
    SET iter = iter +1;
     
    END WHILE iterwhile;
     
    END |
    MySQL a répondu: 
     
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '|' at line 20
    faut que j'arrête de me disperser et que je me concentre sur un problème a la fois, je suis contant je viens de résoudre mon problème de fuseaux horaire de manière peux conventionnel mais bon ça marche, c'est déjà ça lol

    Visiblement, il manque des alias dans ton dernier ON DUPLICATE KEY.
    Il manque l'alias de valeur mais lui je veux qu'il soit modifié si il est différent c'est pour ça que je ne l'ai pas mis (j'ai l'impression encore une fois de dire une connerie lol)

  16. #16
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Les alias sont là pour aider au débogage et surtout pour bien spécifier au SGBD où il doit chercher la colonne citée.

    Pour ton erreur, ne faudrait-il pas un ; après le dernier END ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    alors la je tombe des nus

    en effet changer le | par un ; et ça marche du moins ça a l'air je vais faire des tests pour être sur.

    Ce que je ne comprend pas c'est qu'avant de rajouter la partie 'ON DUPLICATE KEY UPDATE' j'avais un | à la fin qui ne posait aucun problème et la tout d'un coup ça le dérange ??? c'est du a MySql ou c'est un probleme que l'on rencontre aussi avec d'autre SGBD ?

    Une dernière question, si je veux effacer la table import a la fin de l'opération, il me suffit de rajouter TRUNCATE TABLE import à la fin comme ça

    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
    DELIMITER |
     
    DROP PROCEDURE IF EXISTS import_donnees|
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER)
     
    BEGIN
     
    DECLARE iter INTEGER DEFAULT 0; 
     
    iterwhile: WHILE iter <= nbCapteur DO 
     
      SET @myInsert:= 
    CONCAT
    ('
    	INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    	SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    	FROM import i
    	INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    	WHERE i.`',iter,'` <>"(null)"
    	ON DUPLICATE KEY UPDATE id_calendrier_calendrier=id_calendrier_calendrier, 
    		id_station_Stations=id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    ');
     
      prepare stmnt FROM @myInsert; 
      EXECUTE stmnt; 
      DEALLOCATE PREPARE stmnt;
     
     
       SET iter = iter + 1; 
    END WHILE iterwhile;
    TRUNCATE TABLE import;
    END;
    pas besoin de rajouter quelques chose pour dire de supprimer la table a la fin de l'opération ?

  18. #18
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    TRUNCATE opère une destruction/création de la table sans son contenu. C'est ce que tu veux ?

    Je pense que tu devrais ajouter le DELIMITER (le |) à la fin de la procédure :
    Ça indique à MySQL que le lot d'instructions à exécuter est terminé.

    Je vois que tu n'as toujours pas mis les alias dans le ON DUPLICATE KEY !

    Bonne pratique : utiliser les alias partout dès qu'il y a plus d'une table dans une requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #19
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 93
    Par défaut
    les alias c'est quand par exemple je fait "calendrier d" pour renommer la table calendrier d ?

    si c'est ça je ne vois pas pourquoi tu me dit que j'ai oublié des alias dans mon script ???

    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
    DELIMITER |
     
    DROP PROCEDURE IF EXISTS import_donnees|
    CREATE PROCEDURE import_donnees( nbCapteur INTEGER)
     
    BEGIN
     
    DECLARE iter INTEGER DEFAULT 0; 
     
    iterwhile: WHILE iter <= nbCapteur DO 
     
      SET @myInsert:= 
    CONCAT
    ('
    	INSERT INTO relever_mesure(valeur, id_calendrier_calendrier, id_station_Stations, id_capteur_capteur)
    	SELECT i.`',iter,'`,
           c.id_calendrier,
           i.id_station,
           ',iter,' 
    	FROM import i
    	INNER JOIN calendrier c ON i.date_heure = c.date_heure_locale
    	WHERE i.`',iter,'` <>"(null)"
    	ON DUPLICATE KEY UPDATE id_calendrier_calendrier=id_calendrier_calendrier, 
    		id_station_Stations=id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    ');
     
      prepare stmnt FROM @myInsert; 
      EXECUTE stmnt; 
      DEALLOCATE PREPARE stmnt;
     
     
       SET iter = iter + 1; 
    END WHILE iterwhile;
    TRUNCATE TABLE import;
    END;
    il manque bien un alias sur relever_mesure mais il n'est cité qu'une fois du coup est ce nécessaire de le spécifier ?
    Ou alors j'ai encore loupé une marche ce qui ne serait pas impossible ...

    Je te souhaite un bon appétit

  20. #20
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Je parlais des alias dans le ON DUPLICATE KEY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ON DUPLICATE KEY UPDATE id_calendrier_calendrier=id_calendrier_calendrier, 
    		id_station_Stations=id_station_Stations, 
    	id_capteur_capteur=id_capteur_capteur
    De quelles tables proviennent ces colonnes ?

    il manque bien un alias sur relever_mesure mais il n'est cité qu'une fois du coup est ce nécessaire de le spécifier ?
    Nécessaire non mais c'est mieux parce que ça lève les ambiguïtés, tant pour le SGBD que pour le développeur et surtout quand il faudra revenir sur le code dans... un certain temps.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/05/2014, 15h36
  2. Réponses: 8
    Dernier message: 10/04/2014, 16h28
  3. Modification du jeu de résultats d'une procédure stockée
    Par chris2010 dans le forum Développement
    Réponses: 7
    Dernier message: 21/12/2010, 15h09
  4. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  5. Réponses: 5
    Dernier message: 18/06/2007, 18h00

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