У меня есть некоторый Java-код для доступа к SQL Server 2005, который выглядит примерно так:
CallableStatement cstmt = ...;
... // Set input parameters
cstmt.registerOutParameter(11, Types.INTEGER);
cstmt.execute();
int out = cstmt.getInt(11);
И из последней строки выдается следующее исключение:
com.microsoft.sqlserver.jdbc.SQLServerException: The value is not set
for the parameter number 0.
at com.microsoft.sqlserver.jdbc.SQLServerException.
makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
skipOutParameters(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getOutParameter(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getterGetParam(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.
getInt(Unknown Source)
at org.jboss.resource.adapter.jdbc.WrappedCallableStatement.
getInt(WrappedCallableStatement.java:192)
Вызываемая хранимая процедура выглядит примерно так:
CREATE PROCEDURE dbo.stored_proc ( -- 10 input parameters
, @out_param INT OUTPUT) AS
-- Variable declarations
SET @out_param = 0
-- Do processing...
SET @out_param = 1
Поскольку выходной параметр устанавливается на ноль при входе в хранимую процедуру, при каких обстоятельствах это значение нельзя было установить? Или я неправильно понимаю сообщение об ошибке?
Эта ошибка воспроизводится с помощью:
- Драйвер JDBC для SQL Server 1.2
- SQL Server 2005 (64-разрядная версия) с пакетом обновления 2
- SQL Server 2005 (64-разрядная версия) с пакетом обновления 3
Обновление: Похоже, это происходит в результате выполнения части -- Do processing...
хранимой процедуры. Удаление этого устраняет ошибку. Здесь слишком много кода для воспроизведения, и мне хотелось бы, чтобы некоторые указатели на возможные причины сужали вероятных кандидатов.
Обновление: Внедрение ошибок (например, деление на ноль) в -- Do processing...
часть хранимой процедуры не вызывает исключение (вместо этого, как и ожидалось, execute()
сбой вызова с соответствующим сообщением об ошибке).
Обновление: Декомпиляция класса com.microsoft.sqlserver.jdbc.SQLServerCallableStatement предполагает, что «номер параметра 0» является хранимой процедурой возвращаемое значение .
Обновление: Мне не удалось воспроизвести это, вызвав хранимую процедуру непосредственно через Management Studio.
Обновление: Основной причиной этой ошибки является тупик в хранимой процедуре . Обычно, однако, из-за взаимных блокировок вызов execute()
завершается неудачно с SQLException
оберточным кодом ошибки SQL Server 1205 ...