Хранимая процедура MS SQL не возвращает значение (или нужно изменить java?)

Может ли кто-нибудь помочь мне здесь, у меня есть хранимая процедура, которая не возвращает никакого значения, когда я запускаю SP

Запуск как - так в моем Java-коде, который я делаю (exec TestSP(?) с установкой 1 входного параметра:

на консоли MS SQL, работающей как:

exec TestSP @ErrorDescription=''

На обоих основаниях я ничего не получаю обратно.

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

--TestSP

USE [TESTDB]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[Testtbl] @ErrorDescription VARCHAR(40) OUTPUT
AS
    DECLARE @status INT
    SET @status = (
                    SELECT status
                        FROM Testtbl
                  )
    IF @status = 0
        SET @ErrorDescription = 'OK'
    ELSE
        SET @ErrorDescription = 'FAIL'
    RETURN @status

Есть ли что-нибудь, что мне нужно изменить на уровне Java, чтобы это работало, или нужно изменить SP?

Джава:

stmt = connection.prepareCall(sql);
stmt.setString(1, errorDesc);
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.executeUpdate();
String result = stmt.getString(2);

System.outprintln("Result is: "+result);

какие изменения нужно сделать на уровне java, чтобы он работал, я не получаю результата в переменной «результат»?


person codejunkie    schedule 24.03.2014    source источник
comment
Ваша проблема связана с получением значения status, описания ошибки или обоих?   -  person Damien_The_Unbeliever    schedule 24.03.2014
comment
моя проблема с возвратом значения статуса. Спасибо   -  person codejunkie    schedule 24.03.2014


Ответы (2)


Чтобы получить возвращаемое значение, вам нужно присвоить его переменной.

Чтобы получить выходной параметр, вам нужно добавить ключевое слово output при вызове процедуры

ie:

declare @ret int, @ErrorDescription varchar(50)
exec @ret = TestSP @ErrorDescription output
select @ret,  @ErrorDescription 
person podiluska    schedule 24.03.2014
comment
когда вы говорите: вам нужно добавить выходное ключевое слово при вызове процедуры - что вы имеете в виду - все, что я ожидаю сделать, это exec TestSP @ErrorDescription = '', и я ожидаю обратное значение состояния - если SP нужно изменить пусть я знаю, что нужно изменить! - person codejunkie; 24.03.2014
comment
Вы должны назвать это, как подробно описано в ответе. - person podiluska; 24.03.2014
comment
вы не можете сделать это в java или С#, как вы должны выполнить, как я уже упоминал в своем вопросе. - person codejunkie; 24.03.2014
comment
Вы должны пометить параметр как выходной параметр на вызывающем языке, например: C#. - person podiluska; 24.03.2014
comment
нормально с выходным параметром, но я хочу получить @status из SP, а не описание ошибки, которое, как я полагаю, является выходным параметром. что нужно изменить в SP, чтобы статус возвращался при простом выполнении? - person codejunkie; 24.03.2014
comment
Это. Проблема в том, как вы это называете - person podiluska; 24.03.2014
comment
простите, что вы имеете в виду? Вы подразумеваете, что с SP все в порядке, а С# нужно называть его по-другому? - person codejunkie; 24.03.2014
comment
Да, точно. Посмотрите на свойство Direction параметра - person podiluska; 24.03.2014
comment
Можете ли вы привести какие-либо примеры вызова SP таким образом? - person codejunkie; 24.03.2014
comment
stackoverflow.com/questions/3433694/ - person podiluska; 25.03.2014

Ключевое слово RETURN не используется для возврата значения. Для возврата вам нужен оператор SELECT или переменная OUTPUT.

Прочтите RETURN документацию http://technet.microsoft.com/en-us/library/ms174998.aspx

вместо RETURN @status нужно SELECT @status

Ниже приведен правильный пример использования OUTPUT

CREATE PROC testSP
    (
        @pOut VARCHAR(40) OUTPUT
    )
AS
    BEGIN
        DECLARE @something INT = 1;

        IF @something = 0
            SET @pOut = 'Zero'

        IF @something = 1
            SET @pOut = 'One'
    END

DECLARE @outparam VARCHAR(10)
EXEC testSP @pOut = @outparam OUTPUT
SELECT @outparam

как видите, для параметра OUTPUT нужно установить какое-то значение. Если вы не укажете OUTPUT, это будет считаться вводом

person Community    schedule 24.03.2014