1

私はSQLが初めてです。テーブル間で値をコピーするためのトリガーを作成したいと考えています。基本的に、私が終わらせたいタスクは、学生のメッセージ テーブルの値を特定の staff_maibox に転送すること
です。コードは次のとおりです。

drop trigger forward_msg_to_staff;

create or replace trigger forward_msg_to_staff
update on message 
for each row
declare
  message_id    VARCHAR2(10);
  client_id     NUMBER(10);
  staff_id      NUMBER(5);
  message_date  DATE;
  message_title VARCHAR2(20);
  staff_mailbox VARCHAR2(255);
begin
  insert into staff_mailbox(message_id, client_id, staff_id, message_date, message_title, staff_mailbox)
    values(:new.message_id, :new.client_id, :new.staff_id, :sysdate, :new.message_title, :old.staff_mailbox)
end;
/

このコードは正しいですか?お知らせ下さい。前もって感謝します。

4

1 に答える 1

3

CREATE TRIGGER ステートメントの BEFORE または AFTER キーワードが欠落しているため、エラーが発生しています。

ドキュメントに示されているように、これらは必須です。

ここに画像の説明を入力

さらに:

  • すべての変数を宣言する必要はありません。使用していません。
  • :sysdateあなたはそれを拘束していません。sysdate標準 SQL または PL/SQL の場合と同様に、代わりに使用できます。
  • INSERT ステートメントの VALUES 句の後にセミコロンがありません。

これをまとめると、トリガーは次のようになります

create or replace trigger forward_msg_to_staff
 after update on message 
 for each row
begin
  insert into staff_mailbox( message_id, client_id, staff_id, message_date 
                           , message_title, staff_mailbox )
  values ( :new.message_id, :new.client_id, :new.staff_id, sysdate
         , :new.message_title, :old.staff_mailbox );
end forward_msg_to_staff;
/

END でもトリガー名を使用していることに注意してください。これは便宜上のものであり、トリガーがどこで終了するかが明確になります...

トリガーを作成しているときに発生しているエラーを確認したい場合は、 a_horse_with_no_name が示唆show errorsするように使用します。これはコンパイル エラーを示します。これは、エラーを追跡するのに非常に役立ちます。

于 2013-06-29T15:52:03.783 に答える