U gebruikt de :OLD-waarden in uw trigger, wat problematisch lijkt. Op een INSERT zijn de :OLD-waarden allemaal NULL. Dus in het geval van een INSERT lijkt het erop dat u de :NEW-waarden wilt gebruiken.
Op een UPDATE bevatten de :OLD-waarden de pre-update-waarden. Ik weet niet hoe uw voorraadtabel wordt onderhouden, maar het lijkt mij dat u de :OLD-waarden weer in de voorraad wilt toevoegen en vervolgens de :NEW-waarden uit de voorraad wilt verwijderen, ervan uitgaande dat zowel de ORDER_QUANTITY als de STOCK_ID kunnen veranderen.
Wanneer u een DELETE uitvoert, bevatten de :OLD-waarden de pre-deletion-waarden, maar de :NEW-waarden zijn allemaal NULL (logisch, als u erover nadenkt). Dus in het geval van een verwijdering lijkt het erop dat u de :OLD-waarden wilt gebruiken. Als u echter een PO verwijdert, doet u dat dan echt wil je de voorraad aanpassen? Ik denk dat je een soort status van de bestelling nodig hebt om je te laten weten of deze is uitgevoerd of geannuleerd of wat dan ook, en de voorraad alleen weer toe te voegen aan de bulkvoorraadtabel als de bestelling nooit is vervuld.
In ieder geval zou een manier om je trigger te herschrijven zijn:
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;
Ik weet niet zeker of deze logica echt is wat je wilde, omdat ik niet helemaal begrijp wat je probeert te doen, vooral in het geval van DELETE, dus neem het als een voorbeeld en pas de logica toe waar je situatie om vraagt.
Ik zal ook zeggen dat ik denk dat het een slechte keuze is om deze logica in een trigger te stoppen. Bedrijfslogica zoals deze zou niet in een trigger moeten worden geïmplementeerd - het is beter om het in een procedure te stoppen en de procedure aan te roepen wanneer dat nodig is. Het kan problematisch zijn om bedrijfslogica in triggers te stoppen .
Veel succes.