Как изменить значение переменной в форме оракула - PullRequest
0 голосов
/ 21 декабря 2018

Я устал, чтобы найти решение, пожалуйста, помогите мне.

Я хочу знать, как изменить значение переменной первой таблицы reels_table

через другую переменную второй таблицы stockconsumption форма оракула. ​​

предположим,

у меня есть бумага весом 400 кг. Я сохранил это в форме оракула. ​​

на следующий день я продал свою бумагу весом200 кг.

теперь фактическая причина, которую я хочу сделать через пару дней, это

левый вес должен быть в первой табличной переменной для следующей трансдукции.

Myкод ниже с картинкой ref.

DECLARE
REEL_ID1  NUMBER;
REEL_ID2  NUMBER;
LEFT_R1   NUMBER;
LEFT_R2   NUMBER;

BEGIN
       SELECT RID_P,
              RID_N,
              R_W_P_B,
              R_W_N_B 
         INTO REEL_ID1,
              REEL_ID2,
              LEFT_R1,
              LEFT_R2
         FROM STOCKCONSUMPTION
        WHERE :R_ID = REEL_ID1 
          AND :R_ID = REEL_ID2;

       :WEIGHT:=LEFT_R1;
END;

КАРТИНА ЗДЕСЬ

1 Ответ

0 голосов
/ 21 декабря 2018

Код, который вы написали, не имеет особого смысла для меня.

  • Вы объявили множество переменных, но я не думаю, что вам нужна какая-либо из них
  • 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 возвращает текущее значение.Подумайте об этом, посмотрите, имеет ли это смысл в вашем случае.

...