Oracle
 sql >> база данни >  >> RDS >> Oracle

как да задействам актуализация на стойност на ред на таблица, използвайки стойност на ред от друга таблица в Apex Oracle SQL?

Използвате стойностите :OLD във вашия тригер, което изглежда проблематично. На INSERT всички стойности :OLD са NULL. Така че в случай на INSERT, най-малкото изглежда, че бихте искали да използвате стойностите :NEW.

При АКТУАЛИЗАЦИЯ стойностите :OLD съдържат стойностите преди актуализацията. Не знам как се поддържа вашата таблица със запаси, но ми се струва, че бихте искали да добавите стойностите :OLD обратно в запасите, след което да премахнете стойностите :NEW от запасите, като приемем, че както ORDER_QUANTITY, така и STOCK_ID могат да се променят.

Когато правите DELETE, стойностите :OLD съдържат стойностите преди изтриване, но стойностите :NEW са всички NULL (има смисъл, ако се замислите). Така че в случай на изтриване изглежда, че бихте искали да използвате стойностите :OLD. Въпреки това, ако изтривате поръчка за поръчка наистина ли искате да коригирате запасите? Мисля, че ще се нуждаете от някакъв вид състояние на поръчката, за да ви уведоми дали е изпълнена или отменена или каквото и да е, и да добавите наличността обратно в таблицата с насипни наличности само ако поръчката никога не е била изпълнена.

Във всеки случай, един от начините да пренапишете вашия тригер би бил:

create or replace trigger UPDATE_ON_PURCHASE
  BEFORE insert or update or delete on PURCHASE_ORDER
  for each row
  begin
    IF INSERTING THEN
      UPDATE bulk_stock
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF UPDATING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID; 

      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF DELETING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID;
    END IF;
  end;

Не съм сигурен, че тази логика наистина е това, което искахте, тъй като не разбирам напълно какво се опитвате да направите, особено в случая с DELETE, така че го вземете като пример и приложете каквато логика изисква вашата ситуация.

Също така ще кажа, че смятам, че поставянето на тази логика в тригер е лош избор. Бизнес логика като тази не трябва да се внедрява в тригер - по-добре да я поставите в процедура и да извикате процедурата, когато е необходимо. Поставянето на бизнес логика в тригери може да бъде проблематично .

Успех.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да разделим една колона на няколко колони

  2. cx_Oracle:Използване на типове PL/SQL RECORD като аргументи за съхранени процедури

  3. Изпълнете множество SQL изрази с NHibernate

  4. Връща броя на засегнатите редове от MERGE с cx_oracle

  5. Индекси на B-Tree срещу Bitmap база данни