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 :

Erreur de syntaxe


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut Erreur de syntaxe
    Bonjour,

    Je suis en train d'écrire une procédure stockée qui doit me renvoyer l'id, nom et prénom de l'utilisateur qui gère la société dont l'ID est passé en paramètre.

    Les utilisateurs ont des secteurs qui leurs sont attribués, ces secteurs sont des listes de codes postaux et toutes les sociétés situées dans ces secteurs sont sous leur responsabilité.

    A ce simple postulat de base viennent se greffer quelques petites spécificités :
    - Il est possible que la gestion d'une société soit confiée à un autre utilisateur même si la société n'est pas située dans ses secteurs (ajout d'une clé étrangère id_user dans la table société qui, s'il n'est pas NULL pointe vers le commercial auquel on a confié la gestion.)

    - Il est possible que le code postal de la société ne soit pas dans un secteur (codepostal.id_secteur est NULL dans ce cas) et dans ce cas précis il s'agit de déterminer quel utilisateur a la gestion de toutes les sociétés qui sont situées dans des secteurs non définis, cet utilisateur a son champ booléen hors_secteur à true)

    - Si la société est dans un secteur défini on trouve simplement son utilisateur grâce au champ secteur.id_user

    Voici les tables (simplifiées) qui entrent en jeu :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    --
    -- Structure de la table `codepostal`
    --
     
    CREATE TABLE IF NOT EXISTS `codepostal` (
      `code` varchar(255) NOT NULL DEFAULT '', 
      `id_secteur` bigint(20) DEFAULT NULL,
      PRIMARY KEY (`code`),
      KEY `FK3A858D38599282C9` (`id_secteur`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `secteur`
    --
     
    CREATE TABLE IF NOT EXISTS `secteur` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `nom` varchar(255) DEFAULT NULL,
      `id_user` bigint(20) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `FKD8A8087FCF3199EB` (`id_user`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `societe`
    --
     
    CREATE TABLE IF NOT EXISTS `societe` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
     
      `nom` varchar(255) NOT NULL DEFAULT '',
      `id_user` bigint(20) DEFAULT NULL,
      `cp` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `FKE9B37E74CF3199EB` (`id_user`),
      KEY `FKE9B37E74278F1276` (`cp`),
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `user`
    --
     
    CREATE TABLE IF NOT EXISTS `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `nom` varchar(255) DEFAULT NULL,
      `prenom` varchar(255) DEFAULT NULL,
      `hors_secteur` bit(1) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    Et voici la procédure que j'ai écris :

    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
    delimiter |
     
    CREATE PROCEDURE finduser(IN p_id_soc varchar(255))
    BEGIN
    	DECLARE var_id_user bigint(20);
    	DECLARE var_id_cp varchar(255);
    	DECLARE var_id_secteur bigint(20);
     
    	SELECT id_user, code FROM societe where id = p_id_soc INTO var_id_user, var_id_cp;
     
    	IF var_id_user is null THEN 
    		SELECT id_secteur FROM codepostal where code = var_id_cp INTO var_id_secteur;
     
    		IF var_id_secteur is null THEN
    			SELECT id, nom, prenom from user where hors_secteur is true;
    		ELSE 
    			SELECT u.id, u.nom, u.prenom from user u INNER JOIN secteur s on s.id_user = user.id WHERE s.id = var_id_secteur;
    		ENDIF	   			
     
    	ELSE
    		SELECT id, nom, prenom from user where id = var_id_user;
    	ENDIF
     
    END|
     
    delimiter ;
    J'obtiens ce message d'erreur :


    Et le message d'erreur que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use n
    ear 'ELSE
                    SELECT id, nom, prenom from user where id = var_id_user;
            ENDIF
     
    END' at line 18
    C'est la première fois que j'écris une procédure stockée un peu plus complexe, avec des conditions et ça ne me réussit pas trop

    Je vous remercie d'avance pour votre aide

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Je pense que true est une valeur symbolique (=1) et que l'opérateur IS ne lui est pas applicable.
    Il faudrait essayer ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE hors_secteur = true;
    équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE hors_secteur = 1;

Discussions similaires

  1. [Directives] Page blanche quand erreur de syntaxe
    Par syl2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/02/2006, 15h15
  2. [sql] erreur de syntaxe
    Par cmoa59 dans le forum JDBC
    Réponses: 14
    Dernier message: 03/05/2005, 11h41
  3. erreur de syntaxe en C++
    Par sergepmessa dans le forum C++
    Réponses: 6
    Dernier message: 11/03/2005, 18h15
  4. PHP SQL =>erreur de syntaxe (operateur absent)
    Par snipes dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 14h09
  5. erreur de syntaxe javascript dans ma page
    Par Oluha dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/02/2005, 14h53

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