2017-12-09 9 views
0

방아쇠 내부에서 호출하는 저장 프로 시저에 값을 전달하지 않는 "삽입 후"방아쇠에 문제가 있습니다. 그것은 업데이 트에 대한 확인 작동 또한 내가 전화 오전 절차에서 테이블을 쿼리 오전 언급해야합니다. 절차는 현재의 삽입/업데이트 행에 따라 표에 추가되어야 것에 대해 표 2 힌트에 표 및 삽입 내부에 보이는ORACLE - 방아쇠가 프로 시저에 값을 전달하지 않은 경우

create or replace trigger test_trg 
after insert or update on table1 
for each row 
begin 
    test_procedure(:new.value1); 
end; 

: 이 같은 간다.

미리 감사드립니다.

+1

볼 수없는 코드는 디버깅 할 수 없습니다. 샘플 데이터와 함께 호출 된 프로 시저 소스를 게시하십시오. – APC

답변

0

트리거 트랜잭션은 명령문 트랜잭션에 따라 달라집니다. 따라서 커밋되지 않은 레코드는 읽을 수 없습니다. 따라서 "test_procedure"코드를 트리거에 전송하고 사용해야합니다. 새 레코드 값을 사용하여 table2에 데이터를 삽입하십시오. 코드는 다음과 같습니다.

create or replace trigger test_trg 
after insert or update on table1 
for each row 
begin 
    if inserting then 
     insert into table2(ID, F1, F2, ...) 
     values (NEW_ID_VALUE, :NEW.F1_VALUE, :NEW.F2_VALUE, ...); 
    elsif updateing then 
     update table2 
     set F1 = :NEW.F1_VALUE 
     , F2 = :NEW.F2_VALUE 
     where TABLE1_ID_FK = :NEW.ID; 
    end if; 
end; 
+0

약간의 수정 :'updateing' ->'updating' –

+1

Thanks @ BarbarosÖzhan. –

+0

아이디어를 주셔서 감사합니다. 그것은 매우 크고 오히려 지저분한 방아쇠지만, 작동 할 수도 있습니다. 그밖에 아무것도 마음에 들지 않으면 나는 그걸로 갈 것이라고 생각합니다. –

0

찾았습니다! 문제는 방아쇠가 아니며 절차에있었습니다. 내가 보낸 레코드 ID (새 행의 레코드 ID)를 기반으로 "더티 읽기"를 수행했습니다. 내 트리거가 "삽입 후"인데도 절차에서 내 행을 찾을 수없는 것처럼 보입니다. 그리고 내 모든 작업을 기반으로했습니다.

프로 시저에 매개 변수를 추가하고 필요한 모든 항목에 대해 트리거에서 새 값을 직접 전달하여 해결했습니다.