stored - Excepción de acceso al manejador de excepciones MySQL manejado
sqlstate mysql (1)
Parece que RESIGNAL
es lo que estás buscando.
RESIGNAL
permite manejar un error y devolver la información del error. De lo contrario, al ejecutar una instrucción SQL dentro del controlador, se destruye la información que provocó la activación del controlador.RESIGNAL
también puedeRESIGNAL
algunos procedimientos si un manejador determinado puede manejar parte de una situación, luego pasar la condición "arriba de la línea" a otro manejador.
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`resig` $$
CREATE PROCEDURE `test`.`resig` ()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT ''I executed something before throwing the error'' as `this_works`;
RESIGNAL;
END;
SELECT foo FROM bar WHERE baz = 0;
END $$
DELIMITER ;
mysql> call resig();
+------------------------------------------------+
| this_works |
+------------------------------------------------+
| I executed something before throwing the error |
+------------------------------------------------+
1 row in set (0.00 sec)
ERROR 1054 (42S22): Unknown column ''foo'' in ''field list''
mysql>
Estoy intentando deshacer un error, pero aún así dejo que el cliente reciba el error . En realidad, esto podría ser imposible, a menos que haya una forma de acceder al error en un manejador de excepciones.
Es posible "lanzar" desde una excepción, es decir, es posible generar una señal :
CREATE PROCEDURE p ()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SIGNAL SQLSTATE VALUE ''99999''
SET MESSAGE_TEXT = ''An error occurred'';
END;
DROP TABLE no_such_table;
END;
Pero este código de muestra del documento de MySQL parece horrible , porque literalmente se traga todos los errores y los atasca en uno.
SHOW ERRORS
parece relevante, pero no veo ninguna forma de trabajar con él programáticamente, por ejemplo, SELECT Code FROM (SHOW ERRORS);
no es posible.
es posible? ¿Hay alguna mejor práctica que me falta por completo?