sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo desencadenar una actualización en el valor de una fila de tabla usando un valor de fila de otra tabla en Apex Oracle SQL?

Está utilizando los valores :OLD en su disparador, lo que parece problemático. En un INSERT los valores :OLD son todos NULL. Entonces, en el caso de un INSERT, al menos, parece que querrás usar los :NUEVOS valores.

En una ACTUALIZACIÓN, los valores :OLD contienen los valores previos a la actualización. No sé cómo se mantiene su tabla de existencias, pero me parece que le gustaría volver a agregar los valores :OLD al stock y luego eliminar los valores :NEW del stock, asumiendo que tanto ORDER_QUANTITY como STOCK_ID pueden cambiar.

Cuando está haciendo una ELIMINACIÓN, los valores :OLD contienen los valores previos a la eliminación, pero los valores :NEW son todos NULOS (tiene sentido, si lo piensa). Entonces, en el caso de una eliminación, parecería que desearía usar los valores :OLD. Sin embargo, si está eliminando una orden de compra, realmente ¿Quieres ajustar el stock? Creo que necesitaría algún tipo de estado en el pedido para informarle si se ha completado o cancelado o lo que sea, y solo vuelva a agregar el stock a la tabla de stock al por mayor si el pedido nunca se completó.

En cualquier caso, una forma de volver a escribir su disparador sería:

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;

No estoy seguro de que esta lógica sea realmente lo que querías, ya que no entiendo completamente lo que estás tratando de hacer, particularmente en el caso de ELIMINAR, así que tómalo como ejemplo y aplica la lógica que requiera tu situación.

También diré que creo que poner esta lógica en un activador es una mala elección. La lógica comercial como esta no debe implementarse en un disparador; es mejor ponerlo en un procedimiento y llamar al procedimiento cuando sea necesario. Poner la lógica empresarial en disparadores puede ser problemático .

Mucha suerte.