Что может вызвать ошибку JDBC SQL Server «Не задано значение для параметра номер 0» для доступа к выходному параметру? - PullRequest
8 голосов
/ 13 мая 2009

У меня есть некоторый 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 ...

Ответы [ 5 ]

0 голосов
/ 25 апреля 2016

На случай, если кто-то все еще сталкивается с этой проблемой на SQL Server 2008.

У меня возникла та же проблема с оператором обновления при попытке установить метку времени для поля DateTime. Поле оскорбления было в предложении where с индексом, отличным от указанного.

0 голосов
/ 22 сентября 2014

Декомпиляция com.microsoft.sqlserver.jdbc.SQLServerCallableStatement класс предлагает что «номер параметра 0» является возвращаемым значением хранимой процедуры.

Это правильно. Если ваше определение хранимой процедуры имеет 11 входных / выходных параметров, вам действительно нужно определить 12 в вашем коде вызова. Параметр 0 является кодом возврата.

Например, с SP с одним входным и одним выходным параметром, в SSMS вы запускаете это:

DECLARE @ReturnValue INT
DECLARE @P1 INT, @P2 INT

EXEC @ReturnValue= YourSP(@P1,@P2 OUTPUT)

Здесь у вас есть три параметра, а не два.

0 голосов
/ 13 мая 2009

Вы регистрируете выходные параметры? В соответствии с docs"Все параметры OUT должны быть зарегистрированы до выполнения хранимой процедуры."

0 голосов
/ 23 мая 2009

На ум приходит пара вещей:

  1. У вас нет ВОЗВРАТА x (где x - INT, представляющий результат обработки, 0 = успех, все остальное представляет предупреждение или ошибку).
  2. Ваш клиентский код не назначает параметр для возвращаемого значения в дополнение к вашему выходному параметру.

Надеюсь, это поможет,

Bill

0 голосов
/ 13 мая 2009

в ваших параметрах, вы просто объявляете их или устанавливаете для них значение по умолчанию? попробуйте установить для них значение по умолчанию, равное нулю или чему-то еще, и посмотрите, по-прежнему ли вы получаете ошибку.

SQL серверу не нравится, если у вас не установлен параметр по умолчанию и вы не передаете ему значение при выполнении хранимой процедуры.

...