SHOW ERRORS
SHOW ERRORS es una sentencia de diagnóstico que muestra los errores generados por la última instrucción ejecutada en la sesión actual. Sirve para inspeccionar de forma rápida y detallada qué falló, con su código y su mensaje exacto, sin tener que reconstruir el problema a partir de la salida abreviada que a veces ofrece el cliente.
La diferencia con SHOW WARNINGS es importante y conviene tenerla clara desde el principio: SHOW WARNINGS muestra los tres niveles de diagnóstico (errores, advertencias y notas), mientras que SHOW ERRORS filtra y muestra únicamente los errores, es decir, las condiciones cuyo nivel es Error. Cuando solo te interesa lo que realmente impidió completar una operación y quieres ignorar los avisos menores, SHOW ERRORS te da justo eso. En este artículo veremos su sintaxis, cómo contar errores, y cómo se relaciona con GET DIAGNOSTICS, que es la forma de acceder a esta misma información desde dentro de un procedimiento.
Sintaxis
SHOW ERRORS admite varias formas según quieras ver todos los errores, limitar el número de filas o simplemente contarlos. La cláusula LIMIT funciona igual que en un SELECT normal.
-- Ver todos los errores
SHOW ERRORS;
-- Ver un número limitado
SHOW ERRORS LIMIT cantidad;
-- Ver con offset
SHOW ERRORS LIMIT offset, cantidad;
-- Contar errores
SHOW COUNT(*) ERRORS;Hay que tener presente que esta lista se refiere siempre a la última sentencia ejecutada. En cuanto ejecutas una nueva instrucción que genera diagnósticos, la lista anterior se reemplaza, así que SHOW ERRORS debe usarse inmediatamente después de la sentencia que quieres inspeccionar.
Ejemplo básico
Veámoslo en acción. Si ejecutamos una consulta contra una tabla que no existe, MySQL genera un error; acto seguido, SHOW ERRORS nos lo muestra con todo detalle.
-- Provocar un error
-- SELECT * FROM tabla_inexistente;
-- Error: Table 'tienda_mysql.tabla_inexistente' doesn't exist
-- Ver el error
SHOW ERRORS;El resultado contiene una fila por cada error de la última sentencia, con su nivel, su código numérico y su mensaje:
| Level | Code | Message |
|---|---|---|
| Error | 1146 | Table 'tienda_mysql.tabla_inexistente' doesn't exist |
Columnas del resultado
La salida de SHOW ERRORS siempre tiene las mismas tres columnas. Conviene saber qué representa cada una para interpretar correctamente el diagnóstico.
| Columna | Descripción |
|---|---|
| Level | Siempre 'Error' para SHOW ERRORS |
| Code | Código de error numérico de MySQL |
| Message | Texto descriptivo del error |
Como SHOW ERRORS filtra solo los errores, la columna Level mostrará siempre el valor Error. Si vieras Warning o Note, sería porque estás usando SHOW WARNINGS en su lugar.
SHOW COUNT ERRORS
Si solo te interesa saber cuántos errores produjo la última sentencia, sin ver el detalle, puedes pedir el recuento directamente. Es útil en scripts donde quieres decidir un siguiente paso según haya habido errores o no.
-- Contar errores de la última sentencia
SHOW COUNT(*) ERRORS;| @@session.error_count |
|---|
| 1 |
Ese mismo número está disponible también como variable de sesión, lo que resulta cómodo cuando quieres usarlo dentro de una expresión o guardarlo en otra variable:
SELECT @@error_count;Errores vs Warnings
Para fijar la distinción entre ambas sentencias, conviene verlas una al lado de la otra. La primera se centra en lo que falló; la segunda ofrece el panorama completo de diagnósticos.
-- SHOW ERRORS: solo errores (Level = 'Error')
SHOW ERRORS;
-- SHOW WARNINGS: errores + advertencias + notas (ver artículo SHOW WARNINGS)
SHOW WARNINGS;Una buena regla práctica es usar SHOW ERRORS cuando estás depurando un fallo concreto y SHOW WARNINGS cuando quieres asegurarte de que una operación que pareció correcta no dejó avisos silenciosos por el camino, como un truncamiento de datos.
GET DIAGNOSTICS
SHOW ERRORS es una herramienta interactiva, pensada para que tú la ejecutes y leas su salida. Dentro de un procedimiento almacenado no resulta práctica, porque no puedes asignar su resultado a variables con facilidad. Para esos casos, MySQL ofrece GET DIAGNOSTICS, que extrae la misma información y la guarda en variables que tu lógica puede usar.
DELIMITER //
CREATE PROCEDURE diagnostico_ejemplo()
BEGIN
DECLARE v_code INT;
DECLARE v_msg VARCHAR(200);
DECLARE v_count INT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
-- Número de condiciones
GET DIAGNOSTICS v_count = NUMBER;
-- Detalle de la primera condición
GET DIAGNOSTICS CONDITION 1
v_code = MYSQL_ERRNO,
v_msg = MESSAGE_TEXT;
SELECT v_count AS total_condiciones,
v_code AS codigo,
v_msg AS mensaje;
END;
-- Provocar error
INSERT INTO tabla_inexistente VALUES (1);
END //
DELIMITER ;Dentro del handler, la primera llamada a GET DIAGNOSTICS obtiene cuántas condiciones hay, y la segunda, con CONDITION 1, recupera el código y el mensaje de la primera de ellas. Al ejecutar el procedimiento, esos datos se devuelven en una fila:
CALL diagnostico_ejemplo();| total_condiciones | codigo | mensaje |
|---|---|---|
| 1 | 1146 | Table 'tienda_mysql.tabla_inexistente' doesn't exist |
Propiedades de GET DIAGNOSTICS CONDITION
GET DIAGNOSTICS CONDITION puede recuperar bastante más que el código y el mensaje. Esta tabla recoge las propiedades disponibles para cada condición, que coinciden con las que se pueden fijar al lanzar un error con SIGNAL.
| Propiedad | Descripción |
|---|---|
| MYSQL_ERRNO | Código de error de MySQL |
| MESSAGE_TEXT | Mensaje descriptivo |
| RETURNED_SQLSTATE | Código SQLSTATE |
| TABLE_NAME | Tabla relacionada |
| COLUMN_NAME | Columna relacionada |
| SCHEMA_NAME | Esquema relacionado |
Disponer de RETURNED_SQLSTATE además del código numérico es especialmente útil cuando quieres tomar decisiones portables basadas en el estándar SQL en lugar de en los códigos propios de MySQL.
error_count y max_error_count
MySQL no guarda los errores de forma ilimitada: existe un máximo de mensajes que almacena por sentencia, controlado por la variable max_error_count. Puedes consultar su valor actual para saber cuántos diagnósticos como mucho se conservarán.
-- Ver el máximo de errores que MySQL almacena
SELECT @@max_error_count;| @@max_error_count |
|---|
| 1024 |
Si trabajas con operaciones masivas que pueden generar muchísimos avisos y solo te interesan unos pocos, puedes reducir este límite para la sesión y ahorrar memoria:
-- Cambiar el máximo para la sesión
SET max_error_count = 100;Errores comunes
El malentendido más habitual es esperar que SHOW ERRORS muestre errores de sentencias anteriores. No es así: la lista se refiere exclusivamente a la última instrucción que generó diagnósticos. Si entre el error y el SHOW ERRORS ejecutas cualquier otra sentencia, perderás la información que buscabas.
Otro punto que sorprende a quien empieza es que ciertas situaciones que parecen errores se registran en realidad como advertencias o notas, y por tanto no aparecen en SHOW ERRORS. El caso clásico es un truncamiento de datos al insertar: la fila se inserta (recortada), así que MySQL lo considera una advertencia, no un error. Para verlo necesitarías SHOW WARNINGS.
Cuándo usar SHOW ERRORS
SHOW ERRORS es ideal en el trabajo interactivo con la consola de MySQL cuando estás depurando y quieres centrarte solo en lo que falló, sin el ruido de las advertencias. Para el manejo de errores dentro de procedimientos, en cambio, la opción correcta es GET DIAGNOSTICS, porque permite capturar la información en variables y actuar en consecuencia.
En el siguiente artículo veremos SHOW WARNINGS, que amplía la inspección a las advertencias y las notas además de los errores.
Limpieza
Para terminar, eliminamos el procedimiento de ejemplo.
DROP PROCEDURE IF EXISTS diagnostico_ejemplo;Escrito por Eduardo Lázaro
