Oracle
 sql >> Baza danych >  >> RDS >> Oracle

jak wyzwolić aktualizację wartości wiersza tabeli przy użyciu wartości wiersza z innej tabeli w Apex Oracle SQL?

Używasz wartości :OLD w wyzwalaczu, co wydaje się problematyczne. Na INSERT wszystkie wartości :OLD są NULL. Tak więc w przypadku INSERT, przynajmniej wydaje się, że chciałbyś użyć wartości :NEW.

W UPDATE wartości :OLD zawierają wartości sprzed aktualizacji. Nie wiem, jak jest utrzymywana twoja tabela zapasów, ale wydaje mi się, że chciałbyś dodać wartości :OLD z powrotem do magazynu, a następnie usunąć wartości :NEW z magazynu, zakładając, że zarówno ORDER_QUANTITY, jak i STOCK_ID mogą się zmienić.

Kiedy robisz DELETE, wartości :OLD zawierają wartości sprzed usunięcia, ale wszystkie wartości :NEW są NULL (ma to sens, jeśli się nad tym zastanowisz). Tak więc w przypadku usunięcia wydaje się, że chciałbyś użyć wartości :OLD. Jeśli jednak usuwasz zamówienie zakupu, czy naprawdę? chcesz wyregulować zapas? Myślę, że potrzebujesz jakiegoś statusu na zamówieniu, aby poinformować Cię, czy zostało zrealizowane, anulowane lub cokolwiek innego, i dodaj zapasy z powrotem do tabeli zapasów hurtowych tylko wtedy, gdy zamówienie nigdy nie zostało zrealizowane.

W każdym razie jednym ze sposobów przepisania wyzwalacza byłoby:

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;

Nie jestem pewien, czy ta logika jest naprawdę tym, czego chciałeś, ponieważ nie rozumiem do końca, co próbujesz zrobić, szczególnie w przypadku DELETE, więc weź to jako przykład i zastosuj dowolną logikę, której wymaga twoja sytuacja.

Powiem również, że myślę, że umieszczenie tej logiki w wyzwalaczu to zły wybór. Logika biznesowa taka jak ta nie powinna być zaimplementowana w wyzwalaczu — lepiej umieścić ją w procedurze i wywołać procedurę w razie potrzeby. Umieszczenie logiki biznesowej w wyzwalaczach może być problematyczne .

Powodzenia.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apex 5.0:Pokaż pasek postępu podczas wykonywania akcji bazy danych

  2. PLS-00386:znaleziono niezgodność typów między kursorem FETCH a zmiennymi INTO

  3. sqlplus - użycie zmiennej bind w klauzuli IN

  4. Wielokrotna funkcja REPLACE w Oracle

  5. jak możemy pogrupować od 17:00 wczoraj do 17:00 dzisiaj zapisy do dzisiejszej daty?