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 :

Problème déclaration de variable dans procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut Problème déclaration de variable dans procédure stockée
    Hello,

    J'ai créé une base de données de test pour pouvoir me faire la main sur la syntaxe des procdures stockées/triggers sous MySQL. Avoir qu'une table avec la structure la plus basique possible est purement intentionnelle.

    MySQL Workbench sert de base pour la création de procédures stockées.

    La structure de ma table:

    - Nom : Table 1

    Champs
    - ID, INT, Clé primaire
    - LIBELLE, VARCHAR(50)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE PROCEDURE `routine1` ()
    BEGIN
     
    DECLARE iID INT;
    SET iID = 1;
     
     
    DECLARE sValue VARCHAR(50);
    SET sValue = 'test';
     
    INSERT INTO table1(id,libelle) VALUES (iID, sValue);
     
    END
    Aucun problème pour faire tourner la requête avec uniquement la déclaration et assignation de la variable 'sValue', c'est la variable de type INT qui pose problème. Pourquoi ?

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 803
    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 803
    Points : 34 074
    Points
    34 074
    Billets dans le blog
    14
    Par défaut
    Essaie INTEGER au lieu de INT. Ou alors, spécificité de MySQL, essaie SIGNED ou UNSIGNED.

  3. #3
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    C'est surprenant...

    Via MySQL Workbench, ce code fonctionne parfaitement lors de la génération de la base de données et la procédure est fonctionnelle quand je la lance avec l'interface web de PHPmyAdmin. Pour info, j'ai uniquement retiré la déclaration, assignation de l'entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE PROCEDURE `routine1` ()
    BEGIN
     
    DECLARE sValue VARCHAR(50);
    SET sValue = 'test';
     
    INSERT INTO table1(id,libelle) VALUES (1, sValue);
     
    END
    Ce même code lancé sur PHPmyAdmin me sort une erreur sur la ligne de déclaration de sValue.

    J'ai donc fait une procédure stockée bidon sur PHPmyAdmin en écrivant ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE PROCEDURE routine1()
    BEGIN
     
    DECLARE bTest BOOLEAN;
     
     
    END
    Erreur de syntaxe pour la déclaration.

    SIGNED, UNSIGNED INT ou INTEGER ne changent rien au problème.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je pense qu'il faut que vous définissiez un delimiteur :
    Par défaut, le point-virgule indique la fin de l'instruction. ce qui donne simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE PROCEDURE routine1()
    BEGIN
     
    DECLARE bTest BOOLEAN;


    Que donne ceci :

    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 routine1()
    BEGIN
     
    DECLARE bTest BOOLEAN;
     
     
    END
    //
    delimiter ;

  5. #5
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    Pas bien pratique dans ce cas que le délimiteur par défaut soit ';'. Il fallait vraiment le voir surtout que MySQL Workbench refusait d'accepter le: peut importe ou je le mettais. Pour PhpmyAdmin, il faut utiliser le champ délimiteur dans la page web et non l'inscrire dans le code.

    Bref, ça fonctionne. Grand merci à toi et désolé d'avoir posé une question aussi bête.

  6. #6
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 468
    Points
    468
    Par défaut
    J'arrive à lancer la procédure stockée avec ces paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE PROCEDURE `p_i_ajoutnouvelleorganisation`(IN `pDescription` VARCHAR(70), IN `pSite_web` VARCHAR(200), IN `pT_type_org_id` INT)
        MODIFIES SQL DATA
    BEGIN
     
    INSERT INTO T_ORGANISATION(DESCRIPTION, SITE_WEB, T_TYPE_ORG_ID)
    VALUES (pDescription, pSite_web, pType_org_id);
     
    END

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @p0='test'; SET @p1='test'; SET @p2='1'; CALL `p_i_ajoutnouvelleorganisation`(@p0, @p1, @p2);
    Malheureusement, aucune donnée n'est insérée. Évidement j'ai testé en mettant en commentaire la ligne VALUES qui contient mes paramètres et les ai respectivement remplacés par : 'Paramètre 1', 'Paramètre 2', 1. Le tout fonctionne correctement.

Discussions similaires

  1. Problème d'order by dans procédure stockée
    Par Lagnio dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 28/07/2010, 10h16
  2. Déclaration de variables dans une procédure stockée
    Par jbrasselet dans le forum Développement
    Réponses: 5
    Dernier message: 16/02/2009, 10h00
  3. Problème de LIKE dans Procédures stockées
    Par Pilhole dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/02/2008, 15h38
  4. Réponses: 8
    Dernier message: 03/11/2006, 16h55
  5. Réponses: 3
    Dernier message: 20/04/2006, 18h59

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