Tengo un procedimiento almacenado de SQL Server similar a esto:
CREATE PROCEDURE proc1
(
@param DECIMAL
)
AS
BEGIN
INSERT INTO table1 (@param);
-- further commands
END;
GO
Este procedimiento se llama desde Java. Introduje una restricción única en table1
, en la misma columna que se inserta anteriormente. Se espera para obtener una excepción de SQL en Java en caso de una violación de restricción, pero que no está sucediendo. Cuando el procedimiento se ejecuta manualmente desde SSMS, puedo ver que imprime el error de violación de restricción, y luego continúa a lo largo del resto del proceso, que creo que es raro, yo esperaba que fallar. Así que cambié de esta manera:
CREATE PROCEDURE proc1
(
@param DECIMAL
)
AS
BEGIN
BEGIN TRY
INSERT INTO table1 (@param);
END TRY
BEGIN CATCH
THROW 51000, 'Unable to insert', 1;
END CATCH
-- further commands
END;
GO
Ahora cuando yo haga manualmente en SSMS, el procedimiento se detiene en caso de un fallo, e imprime mi mensaje de error. Sin embargo, el proceso de llamar a Java no está recibiendo ninguna indicación del error. ¿Cómo puedo propagar este error llamando a la capa de Java?
ACTUALIZACIÓN: Java capa de llamar a:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://x.x.x.x;database=x";
try (Connection conn = DriverManager.getConnection(connectionUrl, "x", "x")) {
try (CallableStatement stmt = conn.prepareCall("{call proc1(?)}")) {
stmt.setInt(1, 1);
stmt.execute();
System.out.println("Done");
}
}
Al final, puedo ver el mensaje "Done" impreso en la consola.
Añadir SET NOCOUNT ON
que la primera declaración en el proc para suprimir los DONE_IN_PROC
(recuento de filas) Los mensajes de TDS. De lo contrario, el código se necesita consumir todos los resultados devueltos utilizando una ResultSet
y getMoreResults
antes de que se elevó el error en el cliente.