Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment déclencher une mise à jour sur une valeur de ligne de table à l'aide d'une valeur de ligne d'une autre table dans Apex Oracle SQL ?

Vous utilisez les valeurs :OLD dans votre déclencheur, ce qui semble problématique. Sur un INSERT, les valeurs :OLD sont toutes NULL. Donc, dans le cas d'un INSERT, à tout le moins, il semble que vous voudriez utiliser les valeurs :NEW.

Lors d'une mise à jour, les valeurs :OLD contiennent les valeurs de pré-mise à jour. Je ne sais pas comment votre table de stock est maintenue, mais il me semble que vous voudriez ajouter les valeurs :OLD dans le stock, puis supprimer les valeurs :NEW du stock, en supposant que ORDER_QUANTITY et STOCK_ID peuvent changer.

Lorsque vous effectuez un DELETE, les valeurs :OLD contiennent les valeurs de pré-suppression, mais les valeurs :NEW sont toutes NULL (ce qui est logique, si vous y réfléchissez). Ainsi, dans le cas d'une suppression, il semblerait que vous souhaitiez utiliser les valeurs :OLD. Cependant, si vous supprimez un bon de commande, faites-vous vraiment voulez ajuster le stock? Je pense que vous auriez besoin d'un certain type de statut sur la commande pour vous faire savoir si elle a été exécutée ou annulée ou autre, et ne rajoutez le stock dans la table de stock en vrac que si la commande n'a jamais été exécutée.

Dans tous les cas, une façon de réécrire votre déclencheur serait :

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;

Je ne suis pas sûr que cette logique soit vraiment ce que vous vouliez car je ne comprends pas complètement ce que vous essayez de faire, en particulier dans le cas DELETE, alors prenez-le comme exemple et appliquez la logique que votre situation appelle.

Je dirai aussi que je pense que mettre cette logique dans un déclencheur est un mauvais choix. Une logique métier telle que celle-ci ne doit pas être implémentée dans un déclencheur - mieux vaut la mettre dans une procédure et appeler la procédure si nécessaire. Insérer une logique métier dans les déclencheurs peut être problématique .

Bonne chance.