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