2010-06-08 4 views
3
CREATE OR REPLACE TRIGGER UPDATE_TEST_280510 
AFTER insert on TEST_TRNCOMPVISIT 
declare 
V_TRNCOMPNO NUMBER(10); 

CURSOR C1 IS SELECT B.COMPNO FROM TEST_TRNCOMPVISIT A, TEST_TRNCOMPMST B, 
            TEST_MEMMAST C 
WHERE A.COMPNO=B.COMPNO 
AND B.TRNMEMID=C.MEMID 
AND C.MEMOS>=1000; 

begin 
open c1; 
fetch c1 into V_TRNCOMPNO; 


UPDATE TEST_TRNCOMPMST SET COMPSTATUS='P', 
     remark='comp is pending due to O/S>1000' 
WHERE COMPNO=V_TRNCOMPNO AND COMPSTATUS='C'; 
CLOSE C1; 

end; 

트리거 실행 중에 IT- 오류가 표시되지 않을 수돌연변이, 트리거/함수 I이 트리거를 제작하고 테이블 - TEST_TRNCOMPVISIT의 행을 삽입하면서 에러 - 다음 부여합니다

다음 에러가 발생

:

ORA-04091은

: 테이블 TEST.TEST_TRNCOMPVISIT가 돌연변이되어, 트리거/함수는 표시되지 않을 수
ORA-06512 "TEST.UPDATE_TEST_280510에서"TEST.UPDATE_TEST_280510 "4 줄
ORA-06,512에서 ", 줄 10,627,552,314,960,453,210 ORA-04088 : 트리거 'TEST.UPDATE_TEST_280510'

+0

트리거가 FOR EACH ROW 트리거를 기반으로하는 테이블에 액세스하려고하면이 오류가 발생합니다. 트리거 정의에 각 행을 넣지 않았습니까? –

+0

Dear Mr Tony, FOR EACH ROW를 제거한 후에는 오류가 발생하지 않지만 레코드가 트리거 본문에 지정된대로 업데이트되지 않습니다. 친절하게 제안합니다. MaheshA .... –

+0

해야 할 방아쇠가 무엇입니까? 커서 c1이 행을 반환하면 일부 행을 업데이트하는 것처럼 보입니다. –

답변

0

이것이 유일한 방아쇠입니까? 트리거가 테이블 TEST_TRNCOMPMST을 (를) 업데이트합니다. 이 테이블에 TEST_TRNCOMPVISIT에 액세스하는 트리거가 있으면 오류 메시지가 표시됩니다.

+0

예. 선생님, 제가 가지고있는 유일한 방아쇠입니다. TEST_TRNCOMPMST 테이블에 다른 트리거가 없습니다. 테이블 TEST_TRNCOMPMST를 업데이트하려면 테이블 TEST_TRNCOMPMST에있는 compno가있는 테이블 TEST_TRNCOMPVISIT에 레코드를 삽입 할 때마다 테이블 TEST_TRNCOMPMST를 업데이트해야합니다. 오클라호마에서 신선함을 느낄 수있게 도와주세요. 필자는 공부를 끝내기 2 개월 전에이 분야에서 일하는 경험을 갖고 있지 않습니다. MaheshA ... –

4

예외가 각 행으로 정의되고 트리거가 소성되는 테이블에 액세스하려고 할 때 발생한다 "테이블이 돌연변이는"실행 중 오류 에 대한. Tom Kyte는이 예외의 원인과 해결 방법에 대한 훌륭한 가이드를 작성했습니다 here.

게시 된 예제에서는 FOR EACH ROW가 없으므로 예외가 발생할 것으로 예상되지 않습니다. 일반적으로 FOR EACH ROW 트리거는 각 행의 : OLD 또는 : NEW 값에 액세스해야하는 경우에만 사용해야합니다.

+0

죄송합니다. 주어진 예제에서 그것을 입력하는 것을 잊어 버렸습니다. 트리거 정의에서 제거한 후 오류가 발생하지 않지만 레코드가 트리거 본문에 지정된대로 업데이트되지 않습니다. 좋습니다. MaheshA ... –

+0

첫 번째 제안은 트리거에 디버그 메시지를 넣는 것입니다. (a) DBMS_OUTPUT.PUT_LINE을 사용하여 (a) 실행 중임을 확인하고 (b) 커서가 어떤 행을 찾았는지 확인합니다. –

+0

+1, 좋은 대답과 제안. – DCookie