1

メッセージテーブルがあります。メッセージの挿入後、その挿入からの UserID と MsgID を messageRecipient テーブルに挿入する必要があります。メッセージがグループに送信された場合、そのグループのメンバーであるすべてのユーザーにメッセージを挿入する必要があります。ここに私が持っているものがありますが、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;
/

ここで何がうまくいかないのですか?

4

4 に答える 4

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;
于 2012-12-11T09:23:18.180 に答える
3

nullPL/SQL でと比較すると、 と評価されnullます。また、条件文は でのみ実行されtrueます。参考までにこちらをご覧ください。

とに変更userID1 <> nullします。userID1 is not nullgroupID1 <> nullgroupID1 is not null

if insertingまた、このトリガーは挿入ステートメント専用であるため、追加する必要はありません。

于 2012-12-11T08:35:00.007 に答える
0

おそらく、別のセッションから messageRecipient テーブルをチェックしています。トリガーは、メッセージ テーブルへの挿入を行うトランザクションの一部であるため、コミットが発生するまで変更は表示されないことに注意してください。

于 2012-12-11T08:36:45.377 に答える
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;
于 2012-12-11T10:11:57.757 に答える