sql >> Databáze >  >> RDS >> Oracle

jak spustit aktualizaci hodnoty řádku tabulky pomocí hodnoty řádku z jiné tabulky v Apex Oracle SQL?

Ve svém spouštěči používáte hodnoty :OLD, což se zdá problematické. Na INSERTu jsou všechny hodnoty :OLD NULL. Zdá se tedy, že v případě INSERT přinejmenším budete chtít použít hodnoty :NEW.

V UPDATE obsahují hodnoty :OLD hodnoty před aktualizací. Nevím, jak je udržována vaše skladová tabulka, ale zdá se mi, že byste chtěli přidat hodnoty :OLD zpět do skladu a poté odebrat hodnoty :NEW ze skladu, za předpokladu, že se mohou změnit jak ORDER_QUANTITY, tak STOCK_ID.

Když provádíte DELETE, hodnoty :OLD obsahují hodnoty před odstraněním, ale hodnoty :NEW jsou všechny NULL (dává to smysl, pokud o tom přemýšlíte). Takže v případě smazání by se zdálo, že byste chtěli použít hodnoty :OLD. Pokud však mažete PO, skutečně chcete upravit zásoby? Domnívám se, že budete potřebovat nějaký typ stavu objednávky, abyste věděli, zda byla splněna nebo zrušena nebo cokoli jiného, ​​a přidat zásoby zpět do tabulky hromadných zásob pouze v případě, že objednávka nebyla nikdy splněna.

V každém případě jeden způsob, jak přepsat spouštěč, by byl:

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;

Nejsem si jistý, zda je tato logika skutečně to, co jste chtěli, protože úplně nerozumím tomu, o co se snažíte, zejména v případě DELETE, takže to vezměte jako příklad a použijte jakoukoli logiku, kterou vaše situace vyžaduje.

Také řeknu, že si myslím, že uvedení této logiky do spouštěče je špatná volba. Obchodní logika, jako je tato, by neměla být implementována ve spouštěči – je lepší ji vložit do procedury a v případě potřeby proceduru zavolat. Uvádění obchodní logiky do spouštěčů může být problematické .

Hodně štěstí.




  1. SQL Query běží velmi dlouho, pokud hledaný výraz nebyl nalezen

  2. Přístup k databázím kontejneru docker mysql

  3. Obslužný program ukončení MySQL byl ignorován

  4. Jak používat nativní heslo s MySQL 5.7