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
Où avez-vous 'BEGIN' la transaction? Aussi dans une procédure stockée, ou en PHP? – Kenney
Dans la procédure stockée. Bien sûr, le commit est également dans la procédure stockée –
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