2012-12-11 3 views
1

메시지 테이블이 있습니다. 메시지를 삽입 한 후 해당 삽입에서 MessageRecipient 테이블에 UserID와 MsgID를 삽입해야합니다. 메시지가 그룹에 전송 된 경우 해당 그룹의 구성원 인 모든 사용자에게 메시지를 삽입해야합니다. 여기에 내가 무엇을 가지고 있지만 messageRecipient 테이블에 삽입되지 않습니다삽입 후 오라클 트리거

create or replace trigger update_messages 
after insert on messages referencing new as new old as old 
for each row 
declare 
     userID1 int(10); 
     msgID1 int(10); 
     groupID1 int(10); 
begin 
     userID1 := :new.ToUserID; 
     msgID1 := :new.msgID; 
     groupID1 := :new.ToGroupID; 

    if inserting then 
      if(userID1 <> null) 
       then INSERT INTO messageRecipient VALUES(msgID1, userID1); 
      elsif(groupID1 <> null) 
       THEN INSERT INTO messageRecipient(msgID, userID) SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1; 
      end if; 
    end if; 
end; 
/

정확히 잘못 여기 무슨 일이야?

+0

당신은 할당하여 불필요한 복잡성을 추가하는 곳에 정확히 볼 수 있도록 할 경우 변수에 새 값을. 나는 그것들을 제거함으로써 시작할 것입니다. 실제로, 나 였다면 트리거를 제거하고 단일 프로 시저를 사용하여 메시지 테이블에 삽입을 삽입하고받는 테이블에 삽입을 삽입하는 것으로 시작합니다. 트리거는 응용 프로그램을 작동하기 어렵게 만드는 것으로 유명합니다. –

답변

3

PL/SQL에서 null과 비교하면 null으로 평가됩니다. 조건문은 true에서만 실행됩니다. 참고로 here을 확인하십시오.

변경 userID1 <> null에서 userID1 is not nullgroupID1 <> null에서 groupID1 is not null으로 변경하십시오.

if inserting이 트리거는 삽입 문에만 사용되므로 추가 할 필요가 없습니다.

0

아마도 다른 세션에서 messageRecipient 테이블을 확인하고있는 것입니다. 트리거는 메시지 테이블에 삽입하는 트랜잭션의 일부이므로 커밋이 발생할 때까지는 변경 내용이 표시되지 않습니다.

4
create or replace trigger update_messages 
-- after insert on messages referencing new as new old as old 
-- for each row 

declare 
    userID1 int(10); 
    msgID1 int(10); 
    groupID1 int(10); 
begin 
    userID1 := :new.ToUserID; 
    msgID1 := :new.msgID; 
    groupID1 := :new.ToGroupID; 

    if(userID1 is not null) 
      then INSERT INTO messageRecipient VALUES(msgID1, userID1); 
     elsif(groupID1 is not null) 
      THEN INSERT INTO messageRecipient(msgID, userID) SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1; 
     end if; 
end; 
0

나는 ... 당신이 당신의 논리 전에 삽입을 추가하는 경우

'잘못 여기 무슨 일 어떻게 내가 밖으로 작동합니까'라는 질문을 에 대답 할 필요가 제안

 INSERT INTO messageRecipient VALUES(msgID1, userID1); 

    if inserting then..... 

이것은 방아쇠가 발사하고 있고 당신의 새로운 값을 집어 내고 있다고 말할 것입니다

그것은 작동하지 않는 비교 논리이어야합니다 ..

,

당신이 캐치 당신이 오류를 올릴 수있는 모든 조건을했고,이 또한 문제가

if(userID1 is not null) then 
    INSERT INTO messageRecipient VALUES(msgID1, userID1); 
elsif(groupID1 is not null) THEN 
    INSERT INTO messageRecipient(msgID, userID) 
     SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1; 
else 
    RAISE ERROR HERE 
end if;