Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie löst man eine Aktualisierung eines Tabellenzeilenwerts mit einem Zeilenwert aus einer anderen Tabelle in Apex Oracle SQL aus?

Sie verwenden die :OLD-Werte in Ihrem Trigger, was problematisch erscheint. Bei einem INSERT sind alle :OLD-Werte NULL. Im Falle eines INSERT scheint es also zumindest so, als würden Sie die :NEW-Werte verwenden wollen.

Bei einem UPDATE enthalten die :OLD-Werte die Werte vor dem Update. Ich weiß nicht, wie Ihre Bestandstabelle gepflegt wird, aber es scheint mir, dass Sie die :OLD-Werte wieder zum Bestand hinzufügen und dann die :NEW-Werte aus dem Bestand entfernen möchten, vorausgesetzt, dass sich sowohl ORDER_QUANTITY als auch STOCK_ID ändern können.

Wenn Sie ein DELETE durchführen, enthalten die :OLD-Werte die Werte vor dem Löschen, aber die :NEW-Werte sind alle NULL (macht Sinn, wenn Sie darüber nachdenken). Im Falle einer Löschung scheinen Sie also die :OLD-Werte verwenden zu wollen. Wenn Sie jedoch eine Bestellung löschen, tun Sie das wirklich Sie möchten den Bestand anpassen? Ich würde denken, dass Sie eine Art Status der Bestellung benötigen, um Sie darüber zu informieren, ob sie ausgeführt oder storniert wurde oder was auch immer, und den Bestand nur dann wieder in die Bulk-Stock-Tabelle aufnehmen, wenn die Bestellung nie ausgeführt wurde.

In jedem Fall wäre eine Möglichkeit, Ihren Trigger neu zu schreiben:

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;

Ich bin mir nicht sicher, ob diese Logik wirklich das ist, was Sie wollten, da ich nicht vollständig verstehe, was Sie zu tun versuchen, insbesondere im DELETE-Fall, also nehmen Sie es als Beispiel und wenden Sie die Logik an, die Ihre Situation erfordert.

Ich werde auch sagen, dass ich denke, dass es eine schlechte Wahl ist, diese Logik in einen Auslöser zu stecken. Eine solche Geschäftslogik sollte nicht in einem Trigger implementiert werden – es ist besser, sie in eine Prozedur einzufügen und die Prozedur bei Bedarf aufzurufen. Das Einfügen von Geschäftslogik in Trigger kann problematisch sein .

Viel Glück.