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 MySql (but faire une procédure stockée)


Sujet :

SQL Procédural MySQL

  1. #1
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut Syntaxe MySql (but faire une procédure stockée)
    Bonjour,

    Je me remets tout doucement aux SGDB. Ca fait environ 2ans que je n'ai pas fait de SQL (j'étais sous SQL Server).

    Maintenant je suis sous MySql et j'ai quelques soucis, j'ai téléchargé MySQL Query Browser pour me faciliter la tâche.
    Mon but est de faire une procédure stockée qui va chercher des éléments dans une table, et suivi le résultat, d'autres requêtes seront faites, donc dans cette procédure stockées il y aura plusieurs lignes de code exécutées.

    J'ai trouvé des exemples dans des forum, mais jamais avec la même syntaxe, ça me déroute un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Declare strSQL
    SET strSQL = 'SELECT * FROM operation'
    exec strSQL
    le message d'erreur est le suivant :
    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 'Declare strSQL
    SET strSQL = 'SELECT * FROM operation'
    exec strSQL' at line 1

    J'ai aussi essayé la syntaxe SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Declare @strSQL char(200)
    SET @strSQL = 'SELECT * FROM operation'
    exec (@strSQL)

    J'ai essayer de mettre des ; en fin de ligne, mais je n'ai pas trop de succès.
    J'ai supprimé la commande exec qui n'existe peut-etre pas sous MySql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE strSQL CHAR(200);
    SET strSQL = 'SELECT * FROM operations';
    J'ai toujours le même style d'erreurs :
    Script line: 1 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 'DECLARE strSQL CHAR(200)' at line 1
    Script line: 2 Unknown system variable 'strSQL'

    Quelqu'un aurait un lien vers une bonne source de doc à propos des scripts MySQL (version 5.0) ?

    Merci

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Perso je les fais comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE PROCEDURE `strSQL`()
    BEGIN
    SELECT * FROM operation;
    END

  3. #3
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    En fait, je me suis mal exprimé, ce n'est pas aussi simple !
    Je fais une procédure stockée qui fait plusieurs choses.
    - Je récupère des éléments dans une table (de téléchargement) en faisant un select distinct (avec un curseur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE cur CURSOR FOR SELECT DISTINCT `serial_number` FROM `downloading`
    - apres rescrute la table pour faire des 'select count(*)' de chaque éléments pour savoir lesquels ont eu des échecs et combien d'échecs de téléchargements.
    - je stocke ce résultat dans une table temporaire

    J'essaie d'utiliser les CURSOR (là ça va) et les tables temporaires (là ça coince), j'ai donc créé des tables non TEMPORARY.

    J'essaie aussi de créer des requêtes dans la procédure en fonction de certains paramètres comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       SET @matable = CONCAT('table_tmp_', CAST(user_id AS CHAR(5)));
     
        set @strsql = concat('DROP TABLE IF EXISTS `production`.', @matable);
        PREPARE stmt2 FROM @strsql;
        execute stmt2;
        DEALLOCATE PREPARE stmt2;
    j'ai trouvé cette syntaxe, qui devrait être correcte, sur les forum, mais le serveur me retourne :
    Unknown prepared statement handler (strsql) given to EXECUTE

    Je fais mes test avec MySQL Query Browser. Par contre, j'ai fait un test avec MySQL Command Line Client, avec exactement la même syntaxe, je n'ai pas d'erreur.

    J'ai encore beaucoup de mal avec la syntaxe MySQL, à quoi servent les '@' par exemple. Le script de création de la procédure ne retourne aucune erreur, mais je me demande quand même si ne n'ai pas fait des erreurs.

    Merci pour votre aide.

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bonjour,

    construire la requête sous forme de chaîne de caractères peut être effectivement une solution.
    Apparemment d'après le message d'erreur l'erreur ne se situe pas dans le bout de code que tu nous a premièrement montré. peut-tu nous montrer la requête complète ?


  5. #5
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    Bonjour,

    J'ai mis en commentaire la commande INSERT parce qu'elle devra aussi faire l'objet d'un EXECUTE.

    Voici tout le code :
    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
    43
    44
    45
    46
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `production`.`liste`$$
    CREATE DEFINER=`root`@`localhost` PROCEDURE  `production`.`liste`(IN user_id INT, IN operation INT)
    BEGIN
     
        DECLARE sn TEXT;
        DECLARE i INT;
     
     
        DECLARE done INT DEFAULT 0;
        DECLARE cur CURSOR FOR SELECT DISTINCT `serial_number` FROM `downloading` where `operation_number`= operation;
       DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     
       SET @tableTmp = CONCAT('count_liste', CAST(user_id AS CHAR(5)));
     
        set @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
        PREPARE stmt2 FROM @strsql;
        execute stmt2;
        DEALLOCATE PREPARE stmt2;
     
     
        set @strsql = "CREATE TABLE  `production`.";
        set @strsql = concat(@strsql, @tableTmp," (
              `serial_number` varchar(100) NOT NULL default '',
              `nb_erreur` int(11) NOT NULL default '0',
              PRIMARY KEY  (`serial_number`)
              ) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
     
        execute strsql;
     
        OPEN cur;
        REPEAT
            FETCH cur INTO sn;
            IF NOT done THEN
                SET i = (SELECT count(*) FROM `downloading` WHERE `serial_number` = sn);
    --            INSERT INTO `production`.@tableTmp (`serial_number`, `nb_erreur`)
    --              VALUES(sn, i);
            END IF;
        UNTIL done END REPEAT;
        CLOSE cur;
     
        SELECT * FROM `production`.r WHERE `nb_erreur` > 1;
    END $$
     
    DELIMITER ;
    Je me remet doucement au SQL, le code n'est surement pas propre.

    J'aurais aussi une question, ca marche bien quand je claque tout en dur. Pourque le SELECT de la dernière ligne me retourne une erreur me disant que la table n'existe pas quand je fait CREATE TEMPORARY TABLE. Il y a des 'GO' (ou équivalent) à mettre comme dans SQL Server ?

    Vu que je débute en MySQL , je ne sais pas si c'est une erreur de syntaxe ou un problème de config du serveur.

    Merci

  6. #6
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    Ca y est j'ai trouvé mon erreur.

    Pourtant la description de l'erreur était explicite

  7. #7
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bonjour,

    laquelle est-elle ? Cela pourrait servir à d'autres.

  8. #8
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    En fait, au lieu de faire l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
        PREPARE stmt2 FROM @strsql;
        execute stmt2;
        DEALLOCATE PREPARE stmt2;
    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
        execute @strsql;
    L'erreur est au niveau de la requete "CREATE TABLE", dans le code que j'avais posté.

    Erreur toute bête, mais quand on est à fond dedans on se rend plus compte des grosses bêtises qu'on fait, elle était pourtant simple à trouver.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2008, 13h14
  2. [SQL] Comment faire une procédure stockée
    Par PoichOU dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 21h58
  3. Besoin d'aide pour faire une procédure stockée
    Par PoichOU dans le forum SQL
    Réponses: 17
    Dernier message: 30/04/2007, 17h55
  4. Réponses: 2
    Dernier message: 03/12/2006, 12h37
  5. Faire une procédure stockée avec deux tables
    Par mister3957 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2006, 13h54

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