Anda menggunakan nilai :OLD di pemicu Anda yang tampaknya bermasalah. Pada INSERT nilai :OLD semuanya NULL. Jadi dalam kasus INSERT, setidaknya, sepertinya Anda ingin menggunakan nilai :NEW.
Pada UPDATE, nilai :OLD berisi nilai pra-pembaruan. Saya tidak tahu bagaimana tabel stok Anda dipertahankan, tetapi menurut saya Anda ingin menambahkan nilai :OLD kembali ke stok kemudian menghapus nilai :NEW dari stok, dengan asumsi bahwa ORDER_QUANTITY dan STOCK_ID dapat berubah.
Saat Anda melakukan DELETE nilai :OLD berisi nilai pra-penghapusan, tetapi nilai :NEW semuanya NULL (masuk akal, jika Anda memikirkannya). Jadi dalam kasus penghapusan, sepertinya Anda ingin menggunakan nilai :OLD. Namun, jika Anda menghapus PO, apakah Anda benar-benar mau menyesuaikan stok? Saya rasa Anda memerlukan beberapa jenis status pada pesanan untuk memberi tahu Anda apakah pesanan telah dipenuhi atau dibatalkan atau apa pun, dan hanya menambahkan stok kembali ke tabel stok massal jika pesanan tidak pernah terpenuhi.
Bagaimanapun, satu cara untuk menulis ulang pemicu Anda adalah:
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;
Saya tidak yakin bahwa logika ini benar-benar yang Anda inginkan karena saya tidak mengerti sepenuhnya apa yang Anda coba lakukan, terutama dalam kasus DELETE, jadi ambillah sebagai contoh dan terapkan logika apa pun yang dibutuhkan oleh situasi Anda.
Saya juga akan mengatakan bahwa saya pikir menempatkan logika ini dalam pemicu adalah pilihan yang buruk. Logika bisnis seperti ini tidak boleh diimplementasikan di trigger - lebih baik memasukkannya ke dalam prosedur dan memanggil prosedur saat dibutuhkan. Menempatkan logika bisnis ke dalam pemicu dapat menimbulkan masalah .
Semoga berhasil.