2015-03-03 5 views
0

Salut tous donc j'essaie de créer un déclencheur qui mettra à jour les valeurs dans une table lorsqu'elles tombent en dessous d'une certaine valeur.ORACLE SQL Création de déclencheur de mise à jour

Par exemple dire que j'ai le tableau d'inventaire:

Item | Quantity 
-----|--------- 
A |  400 
B |  160 
C |  1200 
D |  105 

Je veux faire un déclencheur qui ajoutera une valeur aléatoire (100 - 200) si la quantité d'un élément ne devrait jamais descendre en dessous de 100

C'est ce que je suis venu avec:

CREATE OR REPLACE TRIGGER QuantityTrigger 
AFTER 
UPDATE ON INVENTORY FOR EACH ROW 
BEGIN 
IF :QUANTITY < 100 THEN 
    UPDATE INVENTORY 
    SET QUANTITY = QUANTITY + dbms_random.value(100,200); 
END IF; 
END; 

Cependant, cela me donne l'erreur: Error(2,9): PLS-00049: bad bind variable 'QUANTITY'

Qu'est-ce que je fais mal? Tout conseil est apprécié. Merci!

+0

supprimer le: devant QUANTITY dans la clause IF, oracle le pense comme une variable d'entrée (bind) – Shankar

+1

try: new.quantity au lieu de – Aramillo

+0

Fait le changement maintenant il me donne l'erreur: 'Error (2,9) : PLS-00201: l'identifiant 'QUANTITY' doit être déclaré ' – Blued00d

Répondre

1

Je crois que la valeur que vous recherchez est:

:new.Quantity 
2

Erreur de syntaxe: Changer :QtyOnHand à :new.QtyOnHand. Erreur logique: Au lieu d'écrire un déclencheur après, remplacez-le par un déclencheur avant et ne mettez à jour que la valeur de la colonne sans effectuer de mise à jour.

CREATE OR REPLACE TRIGGER QuantityTrigger 
BEFORE 
UPDATE ON QITEM FOR EACH ROW 
BEGIN 
IF :new.QtyOnHand < 100 THEN 
    :new.QtyOnHand := :new.QtyOnHand + dbms_random.value(100,200); 
END IF; 
END; 
/

Je voudrais cependant examiner quel programme insère des valeurs dans cette table inférieure à 100 et corrige cela. L'utilisation d'un déclencheur est un hack par lequel vous essayez de masquer les symptômes d'un problème plutôt que de le guérir. Utilisez simplement la même logique dans l'instruction d'insertion où vous pensez que les valeurs inférieures à 100 sont insérées.

+0

Ce code ne fonctionne pas, il y a une erreur avec ': new.QtyOnHand =: new.QtyOnHand' il dit qu'il attend '(' – Blued00d

+0

Désolé fixé.L'opérateur d'affectation est: = not =. – ruudvan