Bạn đang sử dụng các giá trị:OLD trong trình kích hoạt của mình, điều này có vẻ có vấn đề. Trên một INSERT, các giá trị:OLD đều là NULL. Vì vậy, trong trường hợp INSERT, ít nhất, có vẻ như bạn muốn sử dụng:Giá trị MỚI.
Trên CẬP NHẬT, các giá trị:OLD chứa các giá trị trước khi cập nhật. Tôi không biết bảng kho của bạn đang được duy trì như thế nào nhưng với tôi thì có vẻ như bạn muốn thêm các giá trị:OLD trở lại kho, sau đó xóa các giá trị:NEW khỏi kho, giả sử rằng cả ORDER_QUANTITY và STOCK_ID đều có thể thay đổi.
Khi bạn đang thực hiện XÓA, các giá trị:OLD chứa các giá trị trước khi xóa, nhưng các giá trị:MỚI đều là NULL (có lý, nếu bạn nghĩ về nó). Vì vậy, trong trường hợp xóa, có vẻ như bạn muốn sử dụng các giá trị:OLD. Tuy nhiên, nếu bạn đang xóa một PO, bạn có thực sự không muốn điều chỉnh cổ phiếu? Tôi nghĩ rằng bạn cần một số loại trạng thái trên đơn đặt hàng để cho bạn biết liệu đơn đặt hàng đã được hoàn thành hay đã bị hủy hoặc bất cứ điều gì, và chỉ thêm hàng trở lại bảng dự trữ hàng loạt nếu đơn đặt hàng chưa bao giờ được hoàn thành.
Trong mọi trường hợp, một cách để viết lại trình kích hoạt của bạn sẽ là:
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;
Tôi không chắc rằng logic này thực sự là những gì bạn muốn vì tôi không hiểu hoàn toàn những gì bạn đang cố gắng làm, đặc biệt là trong trường hợp XÓA, vì vậy hãy lấy nó làm ví dụ và áp dụng bất kỳ logic nào mà tình huống của bạn yêu cầu.
Tôi cũng sẽ nói rằng tôi nghĩ rằng đặt logic này vào một trình kích hoạt là một lựa chọn tồi. Logic nghiệp vụ như thế này không nên được thực hiện trong một trình kích hoạt - tốt hơn nên đưa nó vào một thủ tục và gọi thủ tục khi cần. Đưa logic nghiệp vụ vào trình kích hoạt có thể là vấn đề .
Chúc may mắn.