2016-11-22 3 views
0

Ich möchte einen Trigger schreiben, der meine Tabelle überprüft und wenn Bedingung erfüllt dann eine Aktualisierung der Tabelle vornimmt. Um genauer zu sein, ich habe zwei Tabellen: Tannen,Oracle vor dem Update-Trigger

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

Und ich habe eine Abfrage wie:

UPDATE CELL SET MaxCalls = MaxCalls-5; 

Und meine Trigger sollte Summe aller MaxCalls in der Zelle Tabelle überprüfen, und es wird immer größer als 30. Wenn in einem Moment, bevor der neue Wert von MaxCalls aktualisiert wird, MaxCalls Summe niedriger als 30 wird, sollte der Trigger eine Fehlermeldung schreiben und die Aktualisierung stoppen.

Hier ist mein Auslöser, aber es gibt mir Fehler.

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; 

Dieser Teil der Trigger gut funktioniert, weil ich es vorher überprüft haben:

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; 

Bitte helfen Sie mir mit diesem Problem. Vielen Dank!

+1

dies Vielleicht ist besser in einem Trigger nach der Anweisung ausgeführt. Überprüfen Sie die Summe einmal, nachdem alle Aktualisierungen durchgeführt wurden, und melden Sie einen Fehler, wenn <30 ist. – Rene

+0

oh, tut mir leid, hier ist es. Fehler bei Zeile: 2 im Befehl - UPDATE CELL SET MaxCalls = MaxCalls-5 Fehlerbericht - SQL Fehler: ORA-04091: Tabelle SYSTEM.CELL ist mutieren, Trigger/Funktion kann es nicht sehen ORA-06512: um "SYSTEM.CHANGE_MAX_CALLS", Zeile 6 ORA-04088: Fehler bei der Ausführung des Triggers 'SYSTEM.CHANGE_MAX_CALLS' 04091. 00000 - "Tabelle% s.% S ist mutierend, Trigger/Funktion kann es nicht sehen" –

+0

* Ursache: Ein Trigger (oder eine benutzerdefinierte plsql-Funktion, die in diese Anweisung referenziert wird) versucht, eine Tabelle zu suchen (oder zu ändern), die in der Mitte von der Anweisung geändert wurde, die es ausgelöst hat. * Aktion: Schreiben Sie den Trigger (oder die Funktion) neu, damit diese Tabelle nicht gelesen wird. –

Antwort