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 :

[Syntaxe] évènement mineur


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Par défaut [Syntaxe] évènement mineur
    Bonjour,

    Pour un projet informatique je dois faire un évènement qui, tous les jours, insère des données dans une table de la base de données. Cette table a un champ ID, un champ date et un champ INT (clé primaire : ID + date). Le champ ID correspond aux agents, stockés dans une autre table de la base.
    Tous les jours donc, pour chaque agent, un par un, je dois ajouté : le numéro de l'agent, la date actuelle, puis un nombre (qui est un nombre de minutes, sans importance ici). Puis je passe à l'agent suivant, etc..

    Voici donc l'évènement que j'ai écris en me baladant sur les tutoriels mis à disposition ainsi que sur la documentation MySQL. Je pense qu'il reste certains bugs, je n'ai pas encore pu le tester à cause d'un problème de notre version de wampserver, mais quand je pourrais le tester je n'aurais pas tout le temps nécessaire afin de le débugger. C'est pourquoi je me permet de demander votre aide afin de bien tout vérifier, histoire qu'il soit le plus opérationnel possible quand je pourrais enfin le tester.

    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
    CREATE EVENT test
    ON SCHEDULE EVERY 1 DAY
    DO CALL insertion;
     
    DELIMITER //
     
    CREATE PROCEDURE test.insertion ()
    DECLARE nbAgents INT;
    BEGIN
    	DECLARE i INT default 1;
    	SELECT count(*) INTO nbAgents FROM agent;
    	WHILE i <= nbAgents DO
    		INSERT INTO heureseffectuees (eidAgent, dateheures, nombreheures) VALUES (i,SYSDATE(),420);
    		i=i+1;
    	END WHILE;
    END//
     
    DELIMITER;
    Merci d'avance, cordialement,

    Adrien

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Par défaut
    J'ai continué à chercher de mon côté, j'ai trouvé pas mal d'erreurs à la fois évidentes et stupides, néanmoins certaines choses me posent encore problème. J'ai lu sur le forum que le DELIMITER pouvait poser problème avec phpmyadmin (j'utilise wampserver) mais je n'ai pas compris les explications données pour contourner le problème.

    Voici ma procédure, je pense que mon programmateur d'évènement est bon mais malheureusement pour le tester lui il me faudra une autre version de MySQL :

    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
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `test.insertion`$$
    CREATE PROCEDURE `test.insertion` ()
    BEGIN
    	DECLARE `nbAgents` INT;
    	DECLARE i INT default 1;
    	SELECT count(*) INTO `nbAgents` FROM `agent`;
    	WHILE i <= `nbAgents` DO
    		INSERT INTO `heureseffectuees` (`eidAgent`, `dateheures`, `nombreheures`) VALUES (i,SYSDATE(),420);
    		i=i+1;
    	END WHILE;
    END$$
     
    DELIMITER ;
    Voila l'erreur retournée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     MySQL a répondu:Documentation
    #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 '=i+1;
        END WHILE;
    END' at line 8
    J'imagine que ça vient du DELIMITER...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Par défaut
    D'après quelques topics ainsi que des sites internet, avec phpmyadmin il faut utiliser le popup DELIMITER qu'ils ont mit sous le champ de rédaction des requêtes. Donc j'ai essayé d'enlever mes DELIMITER et de passer par ça, j'ai encore un bug. J'ai la sensation de pas être loin, mais ça m'embête encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DROP PROCEDURE IF EXISTS `test.insertion`$$
    CREATE PROCEDURE `test.insertion` ()
    BEGIN
    	DECLARE `nbAgents` INT;
    	DECLARE i INT default 1;
    	SELECT count(*) INTO `nbAgents` FROM `agent`;
    	WHILE i <= `nbAgents` DO
    		INSERT INTO `heureseffectuees` (`eidAgent`, `dateheures`, `nombreheures`) VALUES (i,SYSDATE(),420);
    		i=i+1;
    	END WHILE;
    END$$
    Voici l'erreur renvoyé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Erreur
     
    requête SQL:
     
    CREATE PROCEDURE `test.insertion` ( ) BEGIN DECLARE `nbAgents` INT;
     
    MySQL a répondu:Documentation
    #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 3

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Sur le délimiteur, voir l'encadré "à propos du délimiteur" dans cet article : http://alain-defrance.developpez.com...-error/#LIII-B

    Pour ce qui est de ton problème, je doute fort que `test.insertion` soit bon. Tu devrais écrire simplement test.insertion, ou si tu tiens vraiment à te compliquer la vie, `test`.`insertion`.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Par défaut
    Effectivement, ce tutoriel avait échappé à mes recherches, merci à toi.

    Pour les ` que je mets partout, c'est parce que j'ai vu dans un tutoriel qu'il valait mieux les mettre, par contre effectivement tu as raison je n'avais pas fait attention à mon test.insertion.

    Voici ma procédure après ces modifications, avec je crois une meilleur utilisation du DELIMITER, en tout cas la même que dans le tutoriel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELIMITER $$
     
    CREATE PROCEDURE `test`.`insertion` ()
    BEGIN
    	DECLARE nbAgents INT;
    	DECLARE i INT default 1;
    	SELECT count(*) INTO `nbAgents` FROM `agent`;
    	WHILE i <= `nbAgents` DO
    		INSERT INTO `heureseffectuees` (`eidAgent`, `dateheures`, `nombreheures`) VALUES (i,SYSDATE(),420);
    		i=i+1;
    	END WHILE;
    END;$$
    Cependant, MySQL me retourne une autre erreur sans grande précision, si bien que je me demande si mon incrémentation de I est syntaxiquement correct, mais je n'ai rien trouvé, dans la documentation MySQL, concernant ça. Je sais que sous Oracle ce serait plutôt un truc du genre i:=i+1 mais en MySQL je sais pas trop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #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 '=i+1;
        END WHILE;
    END;$$' at line 8

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    tu es passé sur le client texte, ou tu utilises toujours phpMyAdmin ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par Gharbh Voir le message
    J'utilise toujours phpmyadmin, c'est pourquoi j'ai pris comme exemple le screenshot présent dans le tutoriel que tu m'as linké.
    Donc il ne faut pas utiliser l'ordre DELIMITER.

    Au passage, ta procédure est totalement inutile. Tout ça se fait de manière bcp plus juste et efficace en une seule requête.

    Je suppose que ta table agent contient une colonne idAgent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO heureseffectuees (eidAgent, dateheures, nombreheures) 
    SELECT idAgent, SYSDATE(), 420
    FROM agent
    Citation Envoyé par Gharbh Voir le message
    Pour les ` que je mets partout, c'est parce que j'ai vu dans un tutoriel qu'il valait mieux les mettre, par contre effectivement tu as raison je n'avais pas fait attention à mon test.insertion.
    Il faut les mettre si tes noms d'objets contiennent des espaces, des points, des caractères spéciaux, commencent par un chiffre ou encore sont des mots réservés. Autrement dit, si tu nommes tes objects correctement, tu peux t'en passer sans problème. Donc plutôt que de dire "il vaut mieux les mettre", la vraie règle serait plutôt "il vaut mieux ne pas avoir à les mettre" !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. syntaxe sur une procédure et un évènement
    Par bastien dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 16/09/2010, 09h03
  2. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  3. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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