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 :

[MYSQL5] Gestion avancée des erreurs dans procédures stockées (proc stock)


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 52
    Points : 50
    Points
    50
    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 : 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
      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

  2. #2
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    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.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    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 :
    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 ?

  4. #4
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AIX] Gestion des erreurs dans un script
    Par f-k-z dans le forum AIX
    Réponses: 2
    Dernier message: 17/07/2007, 09h45
  2. Réponses: 2
    Dernier message: 30/03/2007, 15h42
  3. Réponses: 4
    Dernier message: 26/01/2007, 11h20
  4. Gestion des erreurs dans un TRIGGER
    Par SDU64 dans le forum DB2
    Réponses: 1
    Dernier message: 18/05/2006, 10h51
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 12h20

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