Bonjour,
Je souhaite gérer les erreurs renvoyées par MariaDB dans mes procédures. J'y arrive bien avec les erreurs de contraintes (clés étrangères non satisfaites, unicité non respectée) avec ce genre de mécanisme :
Mais si la donnée, par exemple de type VARCHAR(20), fournie en entrée de ma procédure est trop longue (plus de 20 caractères), j'obtiens une erreur :
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 DECLARE constraint_exception CONDITION FOR SQLSTATE '23000'; -- Erreur de contrainte DECLARE EXIT HANDLER FOR constraint_exception BEGIN GET DIAGNOSTICS @nb_errors = NUMBER; GET DIAGNOSTICS CONDITION @nb_errors @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; IF LOCATE('fk_tel_id_personne', @text) > 0 THEN SET @errno = 10019; SET @text = 'Identifiant de la personne inconnu'; ELSEIF LOCATE('fk_tel_id_type_telephone', @text) > 0 THEN SET @errno = 10020; SET @text = 'Identifiant du type de numéro de téléphone non valide'; ELSEIF LOCATE('xu_tel_numero', @text) > 0 THEN SET @errno = 10022; SET @text = 'Numéro de téléphone déjà enregistré pour cette personne et de ce type de numéro'; END IF; SIGNAL SQLSTATE VALUE '23000' SET MYSQL_ERRNO = @errno, MESSAGE_TEXT = @text; END;
J'ai essayé d'utiliser le même mécanisme que ci-dessus pour gérer ce cas d'erreur :#1406 - Data too long for column 'numero' at row 2
Mais j'obtiens toujours le message d'erreur en anglais de MariaDB plutôt que mon message personnalisé en français.
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 DECLARE too_long_exception CONDITION FOR SQLSTATE '22001'; -- Donnée d'entrée trop longue DECLARE EXIT HANDLER FOR too_long_exception BEGIN GET DIAGNOSTICS @nb_errors = NUMBER; GET DIAGNOSTICS CONDITION @nb_errors @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; IF LOCATE('numero', @text) > 0 THEN SET @errno = 10021; SET @text = 'Numéro de téléphone trop court ou trop long'; END IF; SIGNAL SQLSTATE VALUE '22001' SET MYSQL_ERRNO = @errno, MESSAGE_TEXT = @text; END;
Une idée de la cause et d'une solution ?
Partager