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!
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
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" –
* 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. –