2016-11-22 7 views
0

Я хочу написать триггер, который проверяет мою таблицу, и если условие выполнено, то обновляет таблицу. Чтобы быть более точным, у меня есть две таблицы: пихты,Oracle до обновления Trigger

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

И у меня есть вопрос как:

UPDATE CELL SET MaxCalls = MaxCalls-5; 

И мой триггер должен проверить сумму всех MaxCalls в таблице CELL, и он будет всегда будет больше 30. Если в какой-то момент, прежде чем новое значение MaxCalls будет обновлено, сумма MaxCalls станет ниже 30, триггер должен написать сообщение об ошибке и прекратить обновление.

Вот мой триггер, но он дает мне ошибки.

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; 

Эта часть триггера работает хорошо, потому что я проверил это раньше:

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; 

Пожалуйста, помогите мне с этой проблемой. Спасибо!

+1

Может быть, это лучше сделать в триггере уровня после утверждения. Проверьте сумму один раз после того, как все обновления были сделаны, и поднимите ошибку, если она <30. – Rene

+0

О, извините, вот оно. Ошибка в строке: 2 в команде - UPDATE CELL SET MaxCalls = MaxCalls-5 Отчет об ошибке - Ошибка SQL: ORA-04091: таблица SYSTEM.CELL является мутирующей, триггер/функция может не видеть ее ORA-06512: at «SYSTEM.CHANGE_MAX_CALLS», строка 6 ORA-04088: ошибка во время запуска триггера «SYSTEM.CHANGE_MAX_CALLS» 04091. 00000 - «таблица% s.% S мутирует, триггер/функция может ее не видеть» –

+0

* Причина: Триггер (или пользовательская функция plsql, на которую ссылается в этот оператор) попытался просмотреть (или изменить) таблицу, которая была , в середине изменения ее утверждения. * Действие: Перепишите триггер (или функцию), чтобы он не читал эту таблицу. –

ответ

Смежные вопросы