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;
이 문제 좀 도와주십시오. 고맙습니다!
어쩌면 이것이 after 문 수준 트리거에서 더 잘 수행됩니다. 모든 업데이트가 완료된 후 합계를 한 번 확인하고 <30 인 경우 오류가 발생합니다. – Rene
아, 죄송합니다. 오류시보고 - SQL 오류 : ORA-04091 : 테이블 SYSTEM.CELL이 변경 중이며 트리거/기능이 변경되지 않습니다. ORA-06512 : at "SYSTEM.CHANGE_MAX_CALLS", line 6 ORA-04088 : 'SYSTEM.CHANGE_MAX_CALLS'트리거 실행 중 오류가 발생했습니다. 04091. 00000 - "테이블 % s. % s이 변경 중이며 트리거/함수에" –
* 원인 : 트리거 (또는이 문에서 에서 참조되는 사용자 정의 plsql 함수)는 실행 한 명령문에 의해 수정되는 중간에 인 테이블을 보거나 수정하려고 시도했습니다. * 지침 : 트리거 (또는 기능)를 해당 테이블을 읽지 않도록 다시 작성하십시오. –