9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
1

Беда с курсором. Видимо, не очищается память

20.11.2017, 17:17. Показов 837. Ответов 6
Метки нет (Все метки)

Есть у меня такой курсор:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
SET @prodName = (SELECT Product_name FROM inserted)
SET @prodQuant = (SELECT Quantity FROM inserted)
-------------------------------------------------
DECLARE quantRawTypeOnOneProduct cursor FOR
SELECT [Raw], Quantity FROM Ingredients WHERE Production = @prodName;
-------------------------------------------------
OPEN quantRawTypeOnOneProduct;
while @@FETCH_STATUS=0
BEGIN
 
fetch NEXT FROM quantRawTypeOnOneProduct INTO @rawNameNeeded, @rawQuantNeededOnOneProduct;
SET @rawQuantOnStock = (SELECT [Quantity] FROM [Raw] WHERE ID = @rawNameNeeded)
 
IF (@rawQuantNeededOnOneProduct * @prodQuant) < @rawQuantOnStock
BEGIN
 
/*Изменение склада сырья*/
SET @rawQuantOnStock = (SELECT [Quantity] FROM dbo.[Raw] WHERE ID = @rawNameNeeded)
SET @rawSumAtLeast = (SELECT [SUM] FROM dbo.[Raw] WHERE ID = @rawNameNeeded)
SET @rawSumAveragePrice = @rawSumAtLeast/@rawQuantOnStock
 
UPDATE [Raw] SET [SUM] = @rawSumAtLeast - @rawSumAveragePrice * @rawQuantNeededOnOneProduct WHERE ID = @rawNameNeeded
UPDATE [Raw] SET Quantity = @rawQuantOnStock - @rawQuantNeededOnOneProduct * @prodQuant WHERE ID = @rawNameNeeded
 
/*Готовая продукция*/
UPDATE [Finished products] SET Quantity = Quantity + @prodQuant WHERE ID = @prodName
UPDATE [Finished products] SET [SUM] = @rawQuantNeededOnOneProduct * @rawSumAveragePrice WHERE ID = @prodName 
UPDATE [Finished products] SET Unit = 1006
 
END
ELSE
ROLLBACK TRANSACTION
print 'Не хватает сырья'
END;
 
CLOSE quantRawTypeOnOneProduct;
DEALLOCATE quantRawTypeOnOneProduct;
 
END
То есть я должен вносить что-то в одну таблицу, а в других должно всё изменяться в соответствии с внесенными данными.
Но вот беда: всё это работает только единожды. То есть если я запускаю Management Studio и выполняю триггер с этим курсором впервые, то всё в порядке. Когда же я во второй раз хочу выполнить триггер, ничего не срабатывает.
Срабатывает только после очередного перезапуска Management Studio. При этом вносятся также данные, которые я пытался использовать до перезапуска.
Что это такое? Как исправить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2017, 17:17
Ответы с готовыми решениями:

Беда с курсором в хаке
Привет всем. Вобщем установил хак, в котором пользователи могут удалять свои новости.. Хак...

Правильно ли очищается память?
сть программа которая работает с динамическим массивом. работает она так: int** a = new int*; ...

Динамические массивы: очищается ли память?
Здравствуйте. Подскажите, пожалуйста, по поводу динамических массивов. Допустим, есть вот такой...

Не очищается динамическая память, codeblocks
При каждой новой прогонке сумма выдается все больше и больше. если что, само задание - в одномерном...

6
3198 / 1938 / 687
Регистрация: 02.06.2013
Сообщений: 4,747
20.11.2017, 17:54 2
Цитата Сообщение от DenKG Посмотреть сообщение
Как исправить?
Весь этот кошмар нужно переписывать без переменных и курсоров и с учетом работы в многопользовательском окружении.

Вот, например, почему вы решили, что с
T-SQL
1
SET @rawQuantOnStock = (SELECT [Quantity] FROM dbo.[Raw] WHERE ID = @rawNameNeeded)
до
T-SQL
1
UPDATE [Raw] SET Quantity = @rawQuantOnStock - @rawQuantNeededOnOneProduct * @prodQuant WHERE ID = @rawNameNeeded
значение Quantity в таблице не изменится?
0
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
20.11.2017, 18:11  [ТС] 3
invm, не очень понял вопроса.

Добавлено через 2 минуты
Цитата Сообщение от invm Посмотреть сообщение
Вот, например, почему вы решили, что значение Quantity в таблице не изменится?
С чего бы ему изменяться?

Добавлено через 3 минуты
Да, понял ваше замечание. Действительно здесь неверно. Однако это семантическая ошибка и спрашивал я не об этом )
0
3198 / 1938 / 687
Регистрация: 02.06.2013
Сообщений: 4,747
20.11.2017, 18:37 4
DenKG, ваша семантическая ошибка следствие использования курсоров и прочей пошаговой обработки. Т.е. императивных методов вместо декларативных.
Переписать нужно примерно так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
declare @InvalidItemsCount int = 0 ;
declare @t (ID varchar(100), [SUM] numeric(18,2), Quantity int);
 
update r
 set
  @InvalidItemsCount += case when ing.Quantity * i.Quantity > r.Quantity then 1 else 0 end,
  Quantity -= ing.Quantity * i.Quantity,
  [SUM] -= a.avgPrice * ing.Quantity
output
  i.Product_name, a.avgPrice * ing.Quantity, i.Quantity
from
 inserted i join
 Ingredients ing with (updlock) on ing.Production = i.Product_name join
 [Raw] r on r.ID = i.Product_name cross apply
 (select [r.SUM] / r.Quantity) a(avgPrice); 
 
if @InvalidItemsCount > 0
 throw 50000, 'Не хватает сырья', 16;
 
update f
 set
  Quantity += t.Quantity,
  [SUM] = t.[SUM],
  Unit = 1006
from
 @t t join
 [Finished products] f on f.ID = t.ID;
А того, о чем вы спрашивали, вообще быть не может. Видимо не так описываете происходящее.
0
3868 / 3295 / 862
Регистрация: 29.08.2013
Сообщений: 21,604
Записей в блоге: 2
20.11.2017, 22:05 5
invm,
Цитата Сообщение от invm Посмотреть сообщение
+=
Цитата Сообщение от invm Посмотреть сообщение
-=
это какая то SQLная магия?
0
1075 / 727 / 173
Регистрация: 27.11.2009
Сообщений: 2,168
20.11.2017, 22:35 6
Цитата Сообщение от qwertehok Посмотреть сообщение
это какая то SQLная магия?
Это операторы присваивания.

Quantity+=t.Quantity - аналог Quantity = Quantity + t.Quantity
Quantity -= ing.Quantity * i.Quantity - аналог Quantity = Quantity - ing.Quantity * i.Quantity

Аналогичные операторы есть во всех С-подобных языках.
В T-SQL появились, кажется, в 2008 году.
0
3198 / 1938 / 687
Регистрация: 02.06.2013
Сообщений: 4,747
20.11.2017, 22:52 7
Цитата Сообщение от qwertehok Посмотреть сообщение
это какая то SQLная магия?
https://docs.microsoft.com/ru-... ansact-sql
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2017, 22:52

Cpp. Как очищается память в функциях?
Я привык, что чисткой памяти занимается GC. А тут надо написать библиотеку на Cpp. От сюда базовые...

Не очищается память при завершении потока
Добрый день уважаемые форумчане. Из главного потока создаю поток который работает в цикле while...

Очищается ли вся динамическая память по завершению программы?
#include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; #include&lt;locale.h&gt; const int Max =...

Почему не очищается память после очистки List а?
Привет. Есть такой код: static void Main(string args) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.