Używasz wartości :OLD w wyzwalaczu, co wydaje się problematyczne. Na INSERT wszystkie wartości :OLD są NULL. Tak więc w przypadku INSERT, przynajmniej wydaje się, że chciałbyś użyć wartości :NEW.
W UPDATE wartości :OLD zawierają wartości sprzed aktualizacji. Nie wiem, jak jest utrzymywana twoja tabela zapasów, ale wydaje mi się, że chciałbyś dodać wartości :OLD z powrotem do magazynu, a następnie usunąć wartości :NEW z magazynu, zakładając, że zarówno ORDER_QUANTITY, jak i STOCK_ID mogą się zmienić.
Kiedy robisz DELETE, wartości :OLD zawierają wartości sprzed usunięcia, ale wszystkie wartości :NEW są NULL (ma to sens, jeśli się nad tym zastanowisz). Tak więc w przypadku usunięcia wydaje się, że chciałbyś użyć wartości :OLD. Jeśli jednak usuwasz zamówienie zakupu, czy naprawdę? chcesz wyregulować zapas? Myślę, że potrzebujesz jakiegoś statusu na zamówieniu, aby poinformować Cię, czy zostało zrealizowane, anulowane lub cokolwiek innego, i dodaj zapasy z powrotem do tabeli zapasów hurtowych tylko wtedy, gdy zamówienie nigdy nie zostało zrealizowane.
W każdym razie jednym ze sposobów przepisania wyzwalacza byłoby:
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;
Nie jestem pewien, czy ta logika jest naprawdę tym, czego chciałeś, ponieważ nie rozumiem do końca, co próbujesz zrobić, szczególnie w przypadku DELETE, więc weź to jako przykład i zastosuj dowolną logikę, której wymaga twoja sytuacja.
Powiem również, że myślę, że umieszczenie tej logiki w wyzwalaczu to zły wybór. Logika biznesowa taka jak ta nie powinna być zaimplementowana w wyzwalaczu — lepiej umieścić ją w procedurze i wywołać procedurę w razie potrzeby. Umieszczenie logiki biznesowej w wyzwalaczach może być problematyczne .
Powodzenia.