我有存储过程启动了应将工具安装到机器的事务。每台计算机可以安装多个工具,但是每个工具只能安装到一台计算机上(限制表创建)。如果打破了这些约束,则应将引发的异常更改为更具体的异常。问题是,当我在SQL Server中运行过程时,一切正常,但是调用callableStatement.executeUpdate()不会在Java代码中引发异常。
我尝试改为使用callableStatement.executeQuery(),并且在引发异常时效果很好,但是如果过程正常运行,我仍然会得到例题“ 0;该语句未返回结果集。; state = null”。
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调用:
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代码会捕获该异常。