Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/10/2006, 13h01   #1
Nouveau Membre du Club
 
Inscription : février 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 52
Points : 36
Points : 36
Par défaut [MYSQL5] Gestion avancée des erreurs dans procédures stockées (proc stock)

Bonjour,

Je souhaiterais effectuer une gestion avancée des erreurs dans mes procédures stockées et récupérer au moins mon numéro d'erreur en dynamique .

J'ai essayé le code ci-dessous, mais il ne me renvoi rien (numerr=vide) en code d'erreur.

Code :
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
  DECLARE ERR     BOOL DEFAULT false;
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING
   BEGIN
       IF @SQLEXCEPTION =0 THEN
         SET numerr := @SQLWARNING;
       ELSE
         SET numerr := @SQLEXCEPTION;
       END IF;
       SET messerr := 'SQL Error...';
       SET ERR = true;
   END;
 
   SET numerr := 0;
   SET messerr := '';
 
   IF (_T) THEN
       SET AUTOCOMMIT=0;
       START TRANSACTION;
   END IF;
   -- ######################################################
   INSERT INTO TABLE   ( champ1, champ2)
   VALUES   (_chp1, _chp2);
 
   SELECT LAST_INSERT_ID()
   INTO id_table_   ;
######################################################
   -- 
 
   IF (_T) THEN
     IF (ERR) THEN
          SELECT -1, numerr, messerr;
          ROLLBACK;
     ELSE
          SELECT id_table_ , 0, '';
       COMMIT;
     END IF;
   END IF;
Quelqu'un pourrait il m'aider, svp ?

d'avance merci.

Filouxera
filouxera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 20h54   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Salut,

Il n'y a pas de variable @SQLEXCEPTION ou @SQLWARNING. Donc, tu ne risques pas d'obtenir une valeur.

En plus, il n'y a apparemment aucun moyen de récupérer le code d'erreur par une variable de session ou une fonction du style LAST_ERROR(). Cela fait un an que cette fonctionnalité est demandée (http://bugs.mysql.com/bug.php?id=11660) et toujours pas de neuf, même pas pour MySQL 5.1

Pour palier ça, tu peux déclarer un handler par SQLSTATE, qui met à un jour une variable => bon amusement.

Ou alors, j'ai lu qu'il serait possible de créer "facilement" une UDF qui retournerait le dernier code d'erreur.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 22h10   #3
Nouveau Membre du Club
 
Inscription : février 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 52
Points : 36
Points : 36
J'avai déjà essayé par récupération du SQLSTATE dans une variable et le résultat était le même.

Tu as dis :
Citation:
Ou alors, j'ai lu qu'il serait possible de créer "facilement" une UDF qui retournerait le dernier code d'erreur.
Une UDF, me semble hasardeux et casse gueule, non ?
filouxera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 22h46   #4
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par filouxera
J'avai déjà essayé par récupération du SQLSTATE dans une variable et le résultat était le même.
Tu avais essayé comment ?
Je pensais à quelque chose du style, pour chaque SQLSTATE possible (ou du moins ceux qui peuvent avoir lieu dans ta procédure) :

Code :
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @SQLSTATE = 23000;
Mais c'est vraiment crade...

Citation:
Envoyé par filouxera
Une UDF, me semble hasardeux et casse gueule, non ?
Ca dépend ce que tu entends par "hasardeux et casse gueule". La fonction en elle-même ne doit pas être très difficile à programmer puisqu'elle correspond à mysql_errno() de l'API (du moins, si on oublie les warnings). Après, faut savoir comment faire, et là je ne peux pas t'aider

Ceci dit, les développeurs de MySQL auraient pu faire un effort. C'est vraiment une fonctionnalité de base, et qui est déjà implémentée pour SHOW ERRORS et SHOW WARNINGS...

Bonne chance et tiens-nous au courant si tu continues l'aventure
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h02.


 
 
 
 
Partenaires

Hébergement Web