Код, который вы написали, не имеет особого смысла для меня.
- Вы объявили множество переменных, но я не думаю, что вам нужна какая-либо из них
WHERE
условие подозрительно;кажется, что вы использовали локальные переменные вместе с элементами блока.Кроме того, насколько вероятно, что :R_ID
равно REEL_ID1
и REEL_ID2
?
Я бы попробовал что-то вроде этого:
select s.r_w_p_b
into :reels_table.weight
from stockconsumption s
where s.rid_p = :reels_table.r_id
and s.rid_n = :reels_table.r_id;
Как выможно увидеть:
- переменные не объявлены, так как I
- выбран непосредственно в элементе блока
- использованы значения элементов в предложении
WHERE
(еще раз, ядумаю, что это неправильно, но вы должны знать лучше)
Однако, если я понял, что вы делаете - вы делаете это неправильно.Запас не должен храниться в виде статического значения в любой таблице - вычисляйте его в любое время.Поддержание целостности в многопользовательской среде станет затруднительным, когда многие люди выполняют DML над одним и тем же набором данных.Вот пример, который показывает общий принцип.
SQL> create table stock
2 (item_id number,
3 transaction_type varchar2(1), -- B - bought; S - sold
4 weight number
5 );
Table created.
SQL> -- bought 400 kg; stock = 400
SQL> insert into stock values (1234, 'B', 400);
1 row created.
SQL> select item_id,
2 sum(decode(transaction_type, 'B', weight, 'S', -weight)) stock
3 from stock
4 group by item_id;
ITEM_ID STOCK
---------- ----------
1234 400
SQL> -- bought additional 600 kg; stock = 1000
SQL> insert into stock values (1234, 'B', 600);
1 row created.
SQL> select item_id,
2 sum(decode(transaction_type, 'B', weight, 'S', -weight)) stock
3 from stock
4 group by item_id;
ITEM_ID STOCK
---------- ----------
1234 1000
SQL> -- sold 300 kg; stock = 700
SQL> insert into stock values (1234, 'S', 300);
1 row created.
SQL> select item_id,
2 sum(decode(transaction_type, 'B', weight, 'S', -weight)) stock
3 from stock
4 group by item_id;
ITEM_ID STOCK
---------- ----------
1234 700
SQL>
Видите?Никаких дополнительных таблиц или столбцов для сохранения текущего состояния - простой SELECT
возвращает текущее значение.Подумайте об этом, посмотрите, имеет ли это смысл в вашем случае.