Oracle
 sql >> Database >  >> RDS >> Oracle

come attivare un aggiornamento su un valore di riga di tabella utilizzando un valore di riga da un'altra tabella in Apex Oracle SQL?

Stai usando i valori :OLD nel tuo trigger che sembra problematico. Su un INSERT i valori :OLD sono tutti NULL. Quindi, nel caso di un INSERT, come minimo, sembra che tu voglia usare i valori :NEW.

In un UPDATE i valori :OLD contengono i valori di pre-aggiornamento. Non so come viene mantenuta la tua tabella stock, ma mi sembra che tu voglia aggiungere i valori :OLD nuovamente in stock, quindi rimuovere i valori :NEW dallo stock, supponendo che sia ORDER_QUANTITY che STOCK_ID possano cambiare.

Quando si esegue un DELETE, i valori :OLD contengono i valori di pre-cancellazione, ma i valori :NEW sono tutti NULL (ha senso, se ci pensi). Quindi, nel caso di un'eliminazione, sembrerebbe che tu voglia utilizzare i valori :OLD. Tuttavia, se stai eliminando un ordine di acquisto, veramente vuoi regolare lo stock? Penso che avresti bisogno di un qualche tipo di stato sull'ordine per farti sapere se è stato evaso o annullato o altro, e aggiungere nuovamente lo stock nella tabella delle scorte all'ingrosso se l'ordine non è mai stato evaso.

In ogni caso, un modo per riscrivere il tuo trigger sarebbe:

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;

Non sono sicuro che questa logica sia davvero ciò che volevi perché non capisco completamente cosa stai cercando di fare, in particolare nel caso DELETE, quindi prendilo come esempio e applica qualsiasi logica richieda la tua situazione.

Dirò anche che penso che mettere questa logica in un trigger sia una cattiva scelta. Una logica aziendale come questa non dovrebbe essere implementata in un trigger:meglio inserirla in una procedura e chiamare la procedura quando necessario. Inserire la logica aziendale nei trigger può essere problematico .

In bocca al lupo.