Dentro de los programas que acceden a las bases de datos con Java JDBC tenemos errores representados por SQLException
y alertas representadas por JDBC SQLWarning.
Una alerta JDBC SQLWarning representa una información sobre algo que no ha ocurrido de forma esperada, pero que no ha sido un impedimento para ejecutar la acción que se había realizado.
Un ejemplo, y el que vamos a desarrollar aquí, es cuando insertamos campos de texto de un tamaño mayor al que se esperaba y se produce un truncado. En el artículo Truncar campos SQL explica cómo realizar esto.
En este caso la alerta genera información indicando que se insertó la información, pero que se tuvo que truncar.
Preparar la tabla
Vamos a crear una tabla con dos campos, el primero será un campo entero TINYINT
que no podrá ser nulo y el segundo será un campo de 4 caracteres.
stmt = con.prepareStatement("CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4))");
stmt.execute();
stmt.close();
Realizar la inserción
Ahora vamos a realizar una inserción de 3 tuplas, las cuales fallarán cada una de una forma diferente. Bien porque el tamaño es superior, o porque es un valor nulo o en un número entero más grande de lo que se puede insertar.
stmt = con.prepareStatement("INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz')");
stmt.execute();
Evaluar la alerta
Ahora pasamos a capturar las alertas. Para ello tenemos que manipular la clase SQLWarning
la cual es una subclase de SQLException
Sobre el PreparedStatement
podemos obtener las alertas que se produzcan mediante el método .getWarnings()
. Este método devuelve una lista de alertas las cuales podemos recuperar medainte el método .getNextWarning()
SQLWarning warning = stmt.getWarnings();
while (warning != null) {
System.out.println("Warning");
System.out.println("Message: " + warning.getMessage());
System.out.println("SQLState: " + warning.getSQLState());
System.out.print("Vendor error code: " + warning.getErrorCode());
System.out.println("");
warning = warning.getNextWarning();
}
stmt.close();
Vemos que los métodos de la clase SQLWarning
son los mismos que los de SQLException
y por lo tanto podemos ver el mensaje de error o código SQL asociado.
En este caso por consola podremos ver las alertas que tiene el INSERT
que hemos hecho.
Warning
Message: Data truncated for column ‘b’ at row 1
SQLState: 01000
Vendor error code: 1265
Warning
Message: Column ‘a’ cannot be null
SQLState: HY000
Vendor error code: 1048
Warning
Message: Out of range value for column ‘a’ at row 3
SQLState: 01000
Vendor error code: 1264
Espero que os haya resultado útil el ejemplo de cómo capturar un JDBC SQLWarning