2016-11-22 9 views
0

내 테이블을 검사하는 트리거를 작성하고 조건이 만족되면 테이블을 업데이트합니다. 구체적으로는, 나는 두 개의 테이블이 있습니다 전나무,오라클 업데이트 업데이트 전

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

을 그리고 난 같은 쿼리가 :

UPDATE CELL SET MaxCalls = MaxCalls-5; 

그리고 내 셀 테이블의 모든 MaxCalls의 합계를 확인해야 트리거, 그리고 것을 항상 30보다 커야합니다. MaxCalls의 새 값이 업데이트되기 전에 MaxCalls sum이 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

어쩌면 이것이 after 문 수준 트리거에서 더 잘 수행됩니다. 모든 업데이트가 완료된 후 합계를 한 번 확인하고 <30 인 경우 오류가 발생합니다. – Rene

+0

아, 죄송합니다. 오류시보고 - SQL 오류 : ORA-04091 : 테이블 SYSTEM.CELL이 변경 중이며 트리거/기능이 변경되지 않습니다. ORA-06512 : at "SYSTEM.CHANGE_MAX_CALLS", line 6 ORA-04088 : 'SYSTEM.CHANGE_MAX_CALLS'트리거 실행 중 오류가 발생했습니다. 04091. 00000 - "테이블 % s. % s이 변경 중이며 트리거/함수에" –

+0

* 원인 : 트리거 (또는이 문에서 에서 참조되는 사용자 정의 plsql 함수)는 실행 한 명령문에 의해 수정되는 중간에 인 테이블을 보거나 수정하려고 시도했습니다. * 지침 : 트리거 (또는 기능)를 해당 테이블을 읽지 않도록 다시 작성하십시오. –

답변