Está utilizando los valores :OLD en su disparador, lo que parece problemático. En un INSERT los valores :OLD son todos NULL. Entonces, en el caso de un INSERT, al menos, parece que querrás usar los :NUEVOS valores.
En una ACTUALIZACIÓN, los valores :OLD contienen los valores previos a la actualización. No sé cómo se mantiene su tabla de existencias, pero me parece que le gustaría volver a agregar los valores :OLD al stock y luego eliminar los valores :NEW del stock, asumiendo que tanto ORDER_QUANTITY como STOCK_ID pueden cambiar.
Cuando está haciendo una ELIMINACIÓN, los valores :OLD contienen los valores previos a la eliminación, pero los valores :NEW son todos NULOS (tiene sentido, si lo piensa). Entonces, en el caso de una eliminación, parecería que desearía usar los valores :OLD. Sin embargo, si está eliminando una orden de compra, realmente ¿Quieres ajustar el stock? Creo que necesitaría algún tipo de estado en el pedido para informarle si se ha completado o cancelado o lo que sea, y solo vuelva a agregar el stock a la tabla de stock al por mayor si el pedido nunca se completó.
En cualquier caso, una forma de volver a escribir su disparador sería:
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;
No estoy seguro de que esta lógica sea realmente lo que querías, ya que no entiendo completamente lo que estás tratando de hacer, particularmente en el caso de ELIMINAR, así que tómalo como ejemplo y aplica la lógica que requiera tu situación.
También diré que creo que poner esta lógica en un activador es una mala elección. La lógica comercial como esta no debe implementarse en un disparador; es mejor ponerlo en un procedimiento y llamar al procedimiento cuando sea necesario. Poner la lógica empresarial en disparadores puede ser problemático .
Mucha suerte.