У меня есть хранимая процедура, которая запускает транзакцию, которая должна установить инструмент на машину. На каждом компьютере может быть установлено несколько инструментов, но каждый инструмент может быть установлен только на одном компьютере (ограничения при создании таблицы). Если эти ограничения нарушены, выбрасываемое исключение следует заменить на более конкретное исключение. Проблема в том, что когда я запускаю процедуру на SQL-сервере, все отлично работает, но вызов callableStatement.executeUpdate () не вызывает исключения в коде Java.
Я попытался использовать callableStatement.executeQuery () вместо этого, и он прекрасно работает, когда генерируется исключение, но если процедуры работают без проблем, я все еще получаю исключение «0; инструкция не возвращает набор результатов; состояние = ноль».
процедура SQL-сервера
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO montaza (oznStroj, sifAlat) VALUES (@oznStroj, @sifAlat);
UPDATE alat
SET montiran = 'D'
WHERE sifAlat = @sifAlat;
UPDATE stroj
SET brojMontiranih = brojMontiranih + 1
WHERE oznStroj = @oznStroj;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
IF ERROR_NUMBER() = @primary_key_error_number
BEGIN
THROW 50511, 'Alat je zauzet', 1;
END
ELSE IF ERROR_NUMBER() = @constraint_broken_code
BEGIN
IF ERROR_MESSAGE() LIKE '%chkKapacitet%'
BEGIN
THROW 50512, 'Kapacitet strojaje popunjen', 1;
END
ELSE
BEGIN
THROW SELECT ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_STATE();
END
END
ELSE
BEGIN
THROW SELECT ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_STATE();
END
END CATCH
GO
JDBC call:
try {
Connection conn = SQLConnectionProvider.getConnection();
CallableStatement callableStatement = conn.prepareCall(installToolTrans);
callableStatement.setInt(1, toolCode);
callableStatement.setString(2, machineTag);
callableStatement.executeUpdate();
callableStatement.close();
conn.close();
} catch (SQLException sqlException) {
throw new DAOException(sqlException.getErrorCode(), sqlException.getMessage(), sqlException.getSQLState());
}
Ожидаемое:
Когда процедура работает правильно и фиксирует изменения, исключение не генерируется Java-кодом, а когда процедура генерирует исключение, Java-код его перехватит.