Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
Добрый вечер!

Прошу помочь. При попытке RETURN-а из процедуры не могу получить корректное значение переменной, которой я проставил оператор OUTPUT:

EXECUTE @REST_VOLUME = MARK_UCHO_ACT_OVERFILL @INNER_RES_ID,@INNER_ART_ID,@ORDERS_RP_TYPE,@ORDERS_RP_CODE,@REST_VOLUME


@REST_VOLUME и в вызываемой и в вызывающей процедурах имеет тип REAL.

Так выглядит определение процедуры, из которой я через OUTPUT пытаюсь получить значение:

ALTER PROCEDURE [dbo].[MARK_UCHO_ACT_OVERFILL] 
@INNER_RES_ID INT,@INNER_ART_ID INT,@ORDERS_RP_TYPE INT,@ORDERS_RP_CODE BIGINT,@REST_VOLUME REAL OUTPUT


В этом месте я пытаюсь выйти из процедуры и вернуть текущее значение @REST_VOLUME из процедуры MARK_UCHO_ACT_OVERFILL:

IF NOT EXISTS (SELECT * FROM #TEMP) RETURN;


Но во всех случаях возвращаемое в @REST_VOLUME значение равно нулю? хотя прямо перед RETURN значение не равно нулю.

Почему так происходит?

P.S.:В другом месте процедуры я использовал такую же схему возврата значения переменной и там никаких проблем не было.
31 окт 15, 20:06    [18353757]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
При попытке SATURN
Guest
makar182,

чтобы вернуть через
EXECUTE @REST_VOLUME =


нужно делать
RETURN @REST_VOLUME


чтобы вернуть через изменение out параметра
в вызове он тоже должен быть помечен как out
а не только в объявлении процедуры
31 окт 15, 20:09    [18353767]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
При попытке SATURN
makar182,

чтобы вернуть через
EXECUTE @REST_VOLUME =


нужно делать
RETURN @REST_VOLUME


чтобы вернуть через изменение out параметра
в вызове он тоже должен быть помечен как out
а не только в объявлении процедуры


Не надо помечать в вызове.

https://technet.microsoft.com/ru-ru/library/ms187004(v=sql.105).aspx
31 окт 15, 20:22    [18353802]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
o-o
Guest
makar182
Не надо помечать в вызове.
https://technet.microsoft.com/ru-ru/library/ms187004(v=sql.105).aspx

смотрим в книгу, видим фигу?

К сообщению приложен файл. Размер - 15Kb
31 окт 15, 20:49    [18353890]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
o-o
makar182
Не надо помечать в вызове.
https://technet.microsoft.com/ru-ru/library/ms187004(v=sql.105).aspx

смотрим в книгу, видим фигу?


Тогда каким образом у меня срабатывает точно такая же схема, только в другой части процедуры, где я не использую OUTPUT при вызове?

Да и вызываю процедуру я иначе:
EXECUTE @REST_VOLUME = MARK_UCHO_ACT_OVERFILL @INNER_RES_ID,@INNER_ART_ID,@ORDERS_RP_TYPE,@ORDERS_RP_CODE,@REST_VOLUME
31 окт 15, 21:15    [18353992]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
o-o
makar182
Не надо помечать в вызове.
https://technet.microsoft.com/ru-ru/library/ms187004(v=sql.105).aspx

смотрим в книгу, видим фигу?


И еще вопрос - зачем в RETURN указывать переменную? В статье по ссылке не используется указание переменной в RETURN.
31 окт 15, 21:18    [18354007]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
saturn duality
Guest
makar182,

это вопрос к автору кода, который то ли через return, то ли через out параметр свой rest_volume получить хочет
может не определился
или хочет узнать, у какого из двух присвоений в одну переменную приоритет выше
31 окт 15, 21:30    [18354071]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
saturn duality
makar182,

это вопрос к автору кода, который то ли через return, то ли через out параметр свой rest_volume получить хочет
может не определился
или хочет узнать, у какого из двух присвоений в одну переменную приоритет выше


Я и есть автор кода. Я не могу понять почему в примере ниже у меня все срабатывает:
EXECUTE @REST_VOLUME = SPIKE.dbo.MARK_UCHO_INNER_CURSOR_RP_TYPE_2  
@INNER_RES_ID, @INNER_ART_ID,@INNER_CNTR_ID,@INNER_RP_TYPE,@INNER_RP_CODE,@INNER_VOL_PCS,@INNER_LAST_DATE
,@INNER_PARSED,@INNER_STATUS_ID_SYNC,@INNER_ORDER_DT_SYNC,@INNER_INCOME_DT_SYNC,@INNER_COMMENT
,@INNER_IS_MY_ACT,@ORDERS_RP_TYPE, @ORDERS_RP_CODE, @ORDERS_VOL_PCS,@ORDERS_DATE,@FLAG_FOR_RP_TYPE_100,@REST_VOLUME


ALTER PROCEDURE [dbo].[MARK_UCHO_INNER_CURSOR_RP_TYPE_2] 

@INNER_RES_ID INT, @INNER_ART_ID INT,@INNER_CNTR_ID INT,@INNER_RP_TYPE INT,@INNER_RP_CODE BIGINT
,@INNER_VOL_PCS REAL,@INNER_LAST_DATE DATETIME,@INNER_PARSED BIT,@INNER_STATUS_ID_SYNC INT
,@INNER_ORDER_DT_SYNC DATE,@INNER_INCOME_DT_SYNC DATE,@INNER_COMMENT NVARCHAR(255),@INNER_IS_MY_ACT BIT
,@ORDERS_RP_TYPE INT, @ORDERS_RP_CODE BIGINT, @ORDERS_VOL_PCS REAL,@ORDERS_DATE DATETIME,@FLAG_FOR_RP_TYPE_100 DATETIME,@REST_VOLUME REAL OUTPUT


Я спокойно получаю в @REST_VOLUME необходимое значение, при этом я не указываю ничего в RETURN, т.к. я уже указал в OUTPUT - также как в статье по ссылке:

--Пример RETURN-а
IF ((SELECT 
		IS_MY_ACT 
	 FROM SPIKE.dbo.MARK_ORDERS_LAST_DATE_CURSOR 
	 WHERE 1=1
		AND RP_TYPE = @INNER_RP_TYPE 
		AND RP_CODE = @INNER_RP_CODE
	 ) IS NOT NULL)
BEGIN
	RETURN
END


Почему в описанной в начале темы ситуации такая схема не срабатывает? Я не стал бы спорить, если бы у меня не было аналогичного, но рабочего, примера.
31 окт 15, 21:46    [18354136]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37138
https://msdn.microsoft.com/ru-ru/library/ms174998(v=sql.120).aspx
RETURN [ integer_expression ]

Аргументы
integer_expression
Возвращаемое целочисленное значение. Хранимые процедуры могут возвращать целочисленное значение вызывающей их процедуре или приложению.


Какое еще "Я спокойно получаю в @REST_VOLUME необходимое значение", если оно не возвращается из процедуры в принципе?

Автор, давайте вы предоставите полное репро вашей ситуации, начиная, скажем, с CREATE DATABASE.
31 окт 15, 22:13    [18354238]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
Гавриленко Сергей Алексеевич
https://msdn.microsoft.com/ru-ru/library/ms174998(v=sql.120).aspx
RETURN [ integer_expression ]

Аргументы
integer_expression
Возвращаемое целочисленное значение. Хранимые процедуры могут возвращать целочисленное значение вызывающей их процедуре или приложению.


Какое еще "Я спокойно получаю в @REST_VOLUME необходимое значение", если оно не возвращается из процедуры в принципе?

Автор, давайте вы предоставите полное репро вашей ситуации, начиная, скажем, с CREATE DATABASE.


Вы были правы. Но что самое интересное, что код был написан так, что оно работало и я думал что благодаря передачи переменной через OUTPUT, а оказалось, что там была страховка:)

Но как тогда все же можно передать значение из процедуры в вызывающую процедуру?
31 окт 15, 22:44    [18354324]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
makar182
Но как тогда все же можно передать значение из процедуры в вызывающую процедуру?
Вам же написали:

При попытке SATURN
чтобы вернуть через изменение out параметра
в вызове он тоже должен быть помечен как out
а не только в объявлении процедуры

o-o
смотрим в книгу, видим фигу?
Картинка с другого сайта.
31 окт 15, 22:49    [18354336]     Ответить | Цитировать Сообщить модератору
 Re: Процедура не возвращает корректное значение переменной при помощи оператора OUTPUT  [new]
makar182
Member

Откуда:
Сообщений: 36
alexeyvg,

Все, разобрался! Спасибо всем большое:) Я до сих пор в шоке как это могло так долго работать:) Опыт использования T-SQL всего в несколько месяцев сказывается.
31 окт 15, 22:52    [18354346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить