sql >> Databasteknik >  >> RDS >> Oracle

hur utlöser man en uppdatering av ett tabellradvärde med hjälp av ett radvärde från en annan tabell i Apex Oracle SQL?

Du använder :OLD-värdena i din trigger, vilket verkar problematiskt. På en INSERT är alla :OLD-värdena NULL. Så i fallet med en INSERT verkar det åtminstone som om du skulle vilja använda :NEW-värdena.

På en UPPDATERING innehåller :OLD-värdena värdena före uppdateringen. Jag vet inte hur din lagertabell underhålls men det verkar som om du vill lägga till :OLD-värdena tillbaka i lager och sedan ta bort :NEW-värdena från lager, förutsatt att både ORDER_QUANTITY och STOCK_ID kan ändras.

När du gör en DELETE innehåller :OLD-värdena värdena före radering, men :NEW-värdena är alla NULL (förnuftigt om du tänker efter). Så i fallet med en radering verkar det som att du skulle vilja använda :OLD-värdena. Men om du tar bort en PO gör du det verkligen vill justera beståndet? Jag skulle tro att du skulle behöva någon typ av status på beställningen för att låta dig veta om den har uppfyllts eller annullerats eller vad som helst, och bara lägga till beståndet tillbaka i bulklagertabellen om beställningen aldrig fullföljdes.

I vilket fall som helst, ett sätt att skriva om din trigger skulle vara:

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;

Jag är inte säker på att den här logiken verkligen är vad du ville, eftersom jag inte helt förstår vad du försöker göra, särskilt i DELETE-fallet, så ta det som ett exempel och använd den logik som din situation kräver.

Jag ska också säga att jag tycker att det är ett dåligt val att sätta denna logik i en trigger. Affärslogik som denna bör inte implementeras i en trigger - bättre att lägga in den i en procedur och ringa proceduren när det behövs. Att sätta in affärslogik i utlösare kan vara problematiskt .

Lycka till.




  1. Hur hanterar man undantag och exekverar återstående satser?

  2. FLUTTER&PHP - Jag kan inte skicka inlägg till mysql-databasen från min flutter-app

  3. Resultat från e-postfrågor som en HTML-tabell i SQL Server (T-SQL)

  4. Sortera efter värdeordning i en select-sats i sats i mysql