Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

làm thế nào để kích hoạt cập nhật giá trị hàng trong bảng bằng cách sử dụng giá trị hàng từ một bảng khác trong Apex Oracle SQL?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để đạt được mức tối đa cho một trường dựa trên ngày và lấy cả các trường khác?

  2. Làm cách nào để tạo thư mục thông qua trình tạo biểu mẫu Oracle?

  3. Triển khai cx_Oracle trên các phiên bản khác nhau của Oracle Client

  4. Làm cách nào để tải Oracle SCHEMA dưới dạng tập lệnh DDL với DBMS_METADATA (và SCHEMA_EXPORT)

  5. Cách chạy các tập lệnh sql từ một thủ tục pl sql