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

hvordan udløses en opdatering på en tabelrækkeværdi ved hjælp af en rækkeværdi fra en anden tabel i Apex Oracle SQL?

Du bruger :OLD-værdierne i din trigger, hvilket virker problematisk. På en INSERT er :OLD værdierne alle NULL. Så i tilfælde af en INSERT ser det i det mindste ud til, at du gerne vil bruge :NEW værdierne.

På en OPDATERING indeholder :OLD værdierne præ-opdateringsværdierne. Jeg ved ikke, hvordan din lagertabel vedligeholdes, men det forekommer mig, at du gerne vil tilføje :OLD-værdierne tilbage til lageret og derefter fjerne :NEW-værdierne fra lageret, forudsat at både ORDER_QUANTITY og STOCK_ID kan ændre sig.

Når du laver en DELETE, indeholder :OLD værdierne førsletningsværdierne, men :NEW værdierne er alle NULL (giver mening, hvis du tænker over det). Så i tilfælde af en sletning ser det ud til, at du gerne vil bruge :OLD værdierne. Men hvis du sletter en PO, gør du det virkelig ønsker at justere bestanden? Jeg vil tro, at du har brug for en form for status på ordren for at fortælle dig, om den er blevet opfyldt eller annulleret eller hvad som helst, og kun tilføje varen tilbage til bulk-lagertabellen, hvis ordren aldrig blev opfyldt.

Under alle omstændigheder ville en måde at omskrive din trigger på være:

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;

Jeg er ikke sikker på, at denne logik virkelig er, hvad du ønskede, da jeg ikke helt forstår, hvad du forsøger at gøre, især i DELETE-sagen, så tag det som et eksempel og anvend den logik, din situation kræver.

Jeg vil også sige, at jeg synes, at det er et dårligt valg at sætte denne logik i en trigger. Forretningslogik som denne bør ikke implementeres i en trigger - bedre at sætte den ind i en procedure og kalde proceduren, når det er nødvendigt. Det kan være problematisk at sætte forretningslogik i triggere .

Held og lykke.




  1. ORAKEL. Godkendelse med LDAP returnerer altid -16

  2. MySQL/PHP - Ville det at sætte anførselstegn omkring tal bryde eventuelle forespørgsler?

  3. Erstat unicode-tegn i PostgreSQL

  4. Hvordan forbinder jeg sql-server med php ved hjælp af xampp?