2016-11-22 4 views
0

Je veux écrire un déclencheur qui vérifie ma table et si la condition est satisfaite, puis met à jour la table. Pour être je plus précis, deux tables: sapins,Oracle Before Update Trigger

CELL(CellId, x0, y0, x1, y1, CurrentPhone#, MaxCalls) 
TELEPHONE(PhoneNo, x, y, PhoneState) 

Et j'ai une requête comme:

UPDATE CELL SET MaxCalls = MaxCalls-5; 

Et mon déclenchement doit vérifier la somme de tous MaxCalls dans la table CELL, et il sera être toujours supérieur à 30. Si dans un moment, avant que la nouvelle valeur de MaxCalls ne soit mise à jour, la somme de MaxCalls soit inférieure à 30, le déclencheur devrait écrire un message d'erreur et arrêter la mise à jour.

Voici mon déclencheur, mais il me donne des erreurs.

CREATE OR REPLACE TRIGGER Change_Max_Calls 
BEFORE UPDATE ON CELL 
FOR EACH ROW 
DECLARE 
    SUMMA INTEGER; 
    CurrentCalls INTEGER; 
    cx0 INTEGER; cx1 INTEGER; cy0 INTEGER; cy1 INTEGER; 
BEGIN 
SELECT SUM(MaxCalls) INTO SUMMA FROM CELL; 
    IF (SUMMA-:NEW.MaxCalls)<30 THEN 
     DBMS_OUTPUT.PUT_LINE('The sum of MaxCalls should be greater than or equal to 30'); 
    ELSE 
     cx0 := :OLD.x0; 
     cx1 := :OLD.x1; 
     cy0 := :OLD.y0; 
     cy1 := :OLD.y1; 
     SELECT COUNT(*) INTO CurrentCalls FROM TELEPHONE 
     WHERE PhoneState='Active' AND x>=cx0 AND x<cx1 AND y>=cy0 AND y<cy1; 
     IF :new.MaxCalls<CurrentCalls THEN 
      :new.MaxCalls := CurrentCalls; 
     END IF; 
    END IF; 


END; 

Cette partie du déclencheur fonctionne bien, parce que je l'ai vérifié avant:

cx0 := :OLD.x0; 
     cx1 := :OLD.x1; 
     cy0 := :OLD.y0; 
     cy1 := :OLD.y1; 
     SELECT COUNT(*) INTO CurrentCalls FROM TELEPHONE 
     WHERE PhoneState='Active' AND x>=cx0 AND x<cx1 AND y>=cy0 AND y<cy1; 
     IF :new.MaxCalls<CurrentCalls THEN 
      :new.MaxCalls := CurrentCalls; 
     END IF; 

S'il vous plaît, aidez-moi à ce problème. Je vous remercie!

+1

Peut-être que cela est mieux fait dans un déclencheur de niveau après déclaration. Vérifiez la somme une fois toutes les mises à jour ont été faites et soulever une erreur si elle est <30. – Rene

+0

oh, désolé, voici. Erreur à partir de la ligne: 2 dans la commande - UPDATE CELL SET MaxCalls = MaxCalls-5 Rapport d'erreur - Erreur SQL: ORA-04091: table SYSTEM.CELL est en train de muter, le déclencheur/la fonction peut ne pas le voir ORA-06512: at "SYSTEM.CHANGE_MAX_CALLS", ligne 6 ORA-04088: erreur lors de l'exécution du déclencheur 'SYSTEM.CHANGE_MAX_CALLS' 04091. 00000 - "La table% s.% S est en mutation, le déclencheur/la fonction peut ne pas le voir" –

+0

* Cause: Un déclencheur (ou une fonction plsql définie par l'utilisateur qui est référencée dans cette instruction) a tenté d'examiner (ou de modifier) ​​une table qui était en cours de modification par l'instruction qui l'a déclenchée. * Action: Réécrire le déclencheur (ou la fonction) afin qu'il ne lise pas cette table. –

Répondre