2016-02-06 3 views
2

J'ai une procédure stockée dans laquelle j'aimerais revenir en cas de problème. Pour ce faire, je suis sur un EXIT HANDLER comme ceci:Redémarrage de MySQL dans le gestionnaire

DECLARE EXIT HANDLER FOR sqlexception 
    begin 
     ROLLBACK; 
    end; 

Mais de cette façon, quand je l'appelle cette procédure stockée, en cas d'erreur, réussir la procédure stockée et je ne sais pas quel était le problème réel? Je veux que le client (php) enregistre l'erreur afin de résoudre le problème. Donc, je modifie de cette façon:

DECLARE EXIT HANDLER FOR sqlexception 
    begin 
     get diagnostics condition 1 
       @p1 = MESSAGE_TEXT; 
     ROLLBACK; 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1; 
    end; 

Alors maintenant, l'annulation de la procédure stockée et que jeter le exeption que le gestionnaire intercepté. C'est cool, mais parfois le MESSAGE_TEXT est plus de 128 caractères et dans ce cas je reçois:

Code d'erreur: 1648. données trop long pour l'élément de condition « MESSAGE_TEXT »

Bien sûr, cette solution n'est pas acceptable:

DECLARE EXIT HANDLER FOR sqlexception 
    begin 
     get diagnostics condition 1 
       @p1 = MESSAGE_TEXT; 
     ROLLBACK; 
     SET @p1=SUBSTRING(@p1,1,128); 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1; 
    end; 

Existe-t-il un moyen d'intercepter une exception, de revenir en arrière et de lancer la même exception au client? Merci beaucoup pour votre aide

+0

Où avez-vous 'BEGIN' la transaction? Aussi dans une procédure stockée, ou en PHP? – Kenney

+0

Dans la procédure stockée. Bien sûr, le commit est également dans la procédure stockée –

+1

Ok merci. Peut-être que [RESIGNAL] (https://dev.mysql.com/doc/refman/5.5/en/resignal.html) est ce que vous cherchez? Il devrait transmettre l'erreur d'origine. – Kenney

Répondre

3

Comme suggéré par Kenney, la réponse est:

DECLARE EXIT HANDLER FOR sqlexception 
    begin 
     ROLLBACK; 
     RESIGNAL; 
    end; 
1

J'utilise ce modèle et cela fonctionne pour moi. Lorsque des exceptions sont rencontrées, le flux de transaction passe immédiatement à DECLARE EXIT HANDLER FOR SQLEXCEPTION. La dernière instruction à être exécutée par le moteur MySQL serait ROLLBACK. Après cela, les flux de transaction se déplace hors de la tblock

Gérer les exceptions grâce en retournant les comme recordset codes d'erreur et un message (pas lancer une erreur de PHP), que votre code PHP peut facilement manipuler et afficher. En SQL, en standard, 0 est un succès et des valeurs non nulles (généralement supérieures à zéro) suggèrent une erreur. Vous voudrez peut-être suivre cela et en faire une pratique.