Използвате стойностите :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, така че го вземете като пример и приложете каквато логика изисква вашата ситуация.
Също така ще кажа, че смятам, че поставянето на тази логика в тригер е лош избор. Бизнес логика като тази не трябва да се внедрява в тригер - по-добре да я поставите в процедура и да извикате процедурата, когато е необходимо. Поставянето на бизнес логика в тригери може да бъде проблематично .
Успех.