У меня есть код 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
- Пакет обновления 2 для SQL Server 2005 (64-разрядная версия)
- SQL Server 2005 (64-разрядная версия) с пакетом обновления 3
Обновление. Похоже, это происходит из-за -- Do processing...
части хранимой процедуры. Удаление этого устраняет ошибку. Здесь слишком много кода, чтобы воспроизвести его, я бы хотел несколько указателей на возможные причины, чтобы сузить круг возможных кандидатов.
Обновление: добавление ошибок (например, деление на ноль) в -- Do processing...
часть хранимой процедуры не вызывает возникновение этого исключения (вместо этого, как и ожидалось, вызов execute()
завершается ошибкой с соответствующим сообщением об ошибке).
Обновление: декомпиляция класса com.microsoft.sqlserver.jdbc.SQLServerCallableStatement предполагает, что «параметр номер 0» является возвращаемым значением хранимой процедуры.
Обновление: мне не удалось воспроизвести это, вызвав хранимую процедуру напрямую через Management Studio.
Обновление. По всей видимости, основной причиной этой ошибки является тупиковая ситуация в хранимой процедуре. Однако обычно тупиковые ситуации вызывают сбой execute()
вызова с SQLException
кодом ошибки SQL Server 1205 ...