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 :

récupérer l'erreur après SIGNAL (MySQL 5.5)


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut récupérer l'erreur après SIGNAL (MySQL 5.5)
    Bonjour à tous

    Apparue avec la 5.5, SIGNAL permet de quitter le bloc en cours en retournant un code erreur, libelle et SQLSTATE.

    A la sortie d'une procédure ça va (voir le test), mais comment récupérer ces informations à la sortie du bloc (en supposant que j'appelle la procédure dans un autre bloc) ?

    J'ai rien trouvé sur le Web, et la doc MySQL est plutôt pitoyable...

    Voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    CREATE TABLE Pilote
    (brevet VARCHAR(6),nom VARCHAR(20), nbHVol DECIMAL(7,2), comp VARCHAR(4),
    CONSTRAINT pk_Pilote PRIMARY KEY(brevet));
     
    INSERT INTO Pilote VALUES ('PL-1', 'Gilles Laborde', 2450, 'AF');
    INSERT INTO Pilote VALUES ('PL-2', 'Frédéric D''Almeyda', 900, 'AF');
    INSERT INTO Pilote VALUES ('PL-3', 'Florence Périssel', 1000, 'SING');
    INSERT INTO Pilote VALUES ('PL-4', 'Sonia Dietrich', 2450, 'CAST');
    INSERT INTO Pilote VALUES ('PL-5', 'Christine Royo', 200, 'AF');
    INSERT INTO Pilote VALUES ('PL-6', 'Aurélia Ente', 2450, 'SING');
    Voici la procédure qui fonctionne bien :

    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
     
     
    delimiter $
     
    CREATE PROCEDURE exsignal1(IN p_brevet VARCHAR(6))
    BEGIN
      DECLARE v_nbHv   DECIMAL(7,2);
      DECLARE v_comp   VARCHAR(4);
      DECLARE pilote_trop_bleu CONDITION FOR SQLSTATE '45000';
     
      SELECT comp,nbHVol INTO v_comp,v_nbHv FROM bdsoutou.Pilote WHERE brevet = p_brevet;
      IF (v_nbHv < 1000) THEN
           SIGNAL pilote_trop_bleu 
                SET MESSAGE_TEXT='Pilote trop peu experimente.',
                    MYSQL_ERRNO = 1001;
       ELSEIF (v_comp != 'AF') THEN
           SIGNAL SQLSTATE '01000'
                SET MESSAGE_TEXT = 'Warning, pas Air France', 
                    MYSQL_ERRNO = 1000;
            ELSE
                SELECT p_brevet,v_nbHv,v_comp;
       END IF; 
    END;
    $
     
    CALL  exsignal1('PL-5')$
    SHOW ERRORS$
     
    CALL  exsignal1('PL-6')$
    SHOW WARNINGS$
     
    CALL  exsignal1('PL-1')$
    Le problème survient, quand j'essaie d'appeler cette procédure dans une autre et de récupérer les messages d'erreur. Le Warning saute, l'erreur est déroutée mais le libelle n'est pas renvoyé.

    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
     
     
    CREATE PROCEDURE exsignal2(IN p_brevet VARCHAR(6))
    BEGIN
      DECLARE v_flag TINYINT DEFAULT 0;
      DECLARE CONTINUE HANDLER 
    -- (idem)    FOR SQLWARNING SET v_flag = 1;
              FOR SQLSTATE '01000' SET v_flag = 1;
      DECLARE CONTINUE HANDLER 
              FOR SQLSTATE VALUE '45000' SET v_flag = 2;
     
      CALL exsignal1(p_brevet);
     
       CASE 
       WHEN v_flag=0 THEN SELECT 'Pilote OK';
       WHEN v_flag=1 THEN 
                 SELECT 'v_flag=1';
                 SHOW WARNINGS;
       WHEN v_flag=2 THEN 
                 SELECT 'v_flag=2';
                 SHOW ERRORS;
      END CASE;
    END;
    $
     
    CALL bdsoutou.exsignal2('PL-5')$
    CALL bdsoutou.exsignal2('PL-6')$
    CALL bdsoutou.exsignal2('PL-1')$

  2. #2
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut
    J'étais en 5.5.5-m3, la solution est peut être dans la dernière version 5.5.6-rc où il est signalé dans

    http://forums.mysql.com/read.php?3,3...313#msg-386313

    * Incompatible Change: Handling of warnings and errors
    during stored program execution was problematic:

    + If one statement generated several warnings or
    errors, only the handler for the first was
    activated, even if another might be more
    appropriate.

    + Warning or error information could be lost.

    (Bug#36185: http://bugs.mysql.com/bug.php?id=36185,
    Bug#5889: http://bugs.mysql.com/bug.php?id=5889,
    Bug#9857: http://bugs.mysql.com/bug.php?id=9857,
    Bug#23032: http://bugs.mysql.com/bug.php?id=23032)
    J'upgrade et je fais suivre...

  3. #3
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut
    La 5.5.6-rc résous ce problème et fait fonctionner correctement la récupération d'un handler après retour d'appel.

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

Discussions similaires

  1. [MySQL] récupérer l'erreur MySQL
    Par jamdinhe dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/12/2012, 15h33
  2. MySQL-ODBC - Récupérer l'id après un Insert()
    Par kurkaine dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/11/2007, 05h47
  3. Récupérer ses données après formatage
    Par Sékiltoyai dans le forum Composants
    Réponses: 7
    Dernier message: 21/04/2007, 18h01
  4. Réponses: 8
    Dernier message: 25/01/2006, 12h06
  5. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42

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