Gestion des erreurs de procédure stockée MySQL
Je crois que rien n'est actuellement disponible dans MySQL qui permet d'accéder à la SQLSTATE
de la dernière instruction exécutée dans une base de données MySQL procédure stockée. Cela signifie que lorsqu'un générique SQLException
est soulevée dans une procédure stockée, il est difficile/impossible de dériver la nature exacte de l'erreur.
Quelqu'un at-il une solution de contournement pour calculer le SQLSTATE
d'une erreur dans une base de données MySQL procédure stockée qui ne nécessite pas de déclaration d'un gestionnaire pour chaque SQLSTATE?
Par exemple imaginer que je suis en train de retourner un error_status qui va au-delà du générique de "SQLException est arrivé quelque part dans ce BEGIN....END
bloc" dans le texte suivant:
DELIMITER $$
CREATE PROCEDURE `myProcedure`(OUT o_error_status varchar(50))
MY_BLOCK: BEGIN
DECLARE EXIT handler for 1062 set o_error_status := "Duplicate entry in table";
DECLARE EXIT handler for 1048 set o_error_status := "Trying to populate a non-null column with null value";
-- declare handlers ad nauseum here....
DECLARE EXIT handler for sqlexception set o_error_status:= "Generic SQLException. You'll just have to figure out the SQLSTATE yourself...." ;
-- Procedure logic that might error to follow here...
END MY_BLOCK$$
Des conseils?
PS je suis sous MySQL 5.1.49
source d'informationauteur Tom Mac
Vous devez vous connecter pour publier un commentaire.
OBTENIR des DIAGNOSTICS est disponible dans 5.6.4
Voir
http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html
Heureusement que c'est pas vrai.
Montrera la dernière erreur ou d'avertissement.
Afin d'éviter d'énumérer chaque et chaque erreur, vous pouvez gérer une classe de SQL-errors:
Afin de gérer une exception, vous devez seulement faire:
Liens:
http://dev.mysql.com/doc/refman/5.5/en/signal.html
http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
Je suis en train de faire la solution de contournement suivante: à l'aide d'un SELECT provocate une erreur. Par exemple:
Cela se traduira dans le message d'erreur suivant (exemple):
Je termine mon appel à une procédure stockée dans un try { ... } catch { ... } et maintenant vous pouvez gérer cette erreur. Cela ne fonctionne que pour la provocation des messages d'erreur personnalisés à partir de l'intérieur de votre procédure stockée et ne le sera pas pour tout de SQL ou des erreurs de base de données, qui peut se faire (en raison de la double-entrée de clé). Dans ce dernier cas, vous pourriez être en mesure de contourner ce problème en utilisant la solution de Johan.