创建触发器,用于在oracle中的表之间复制值

时间:2013-06-29 12:23:15

标签: oracle triggers

我是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;
/

这段代码是否正确? 请指教。提前谢谢。

1 个答案:

答案 0 :(得分:3)

您收到错误是因为您错过了CREATE TRIGGER statement中的BEFORE或AFTER关键字。

如文档中所示,这些是必需的:

enter image description here

此外:

  • 没有必要声明所有变量,你没有使用它们
  • :sysdate不正确,您没有绑定它。您可以像使用标准SQL或PL / SQL一样使用sysdate
  • 您在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中使用了触发器名称。这只是为了方便起见,它使触发器结束的位置变得明显......

如果您想查看创建触发器时遇到的错误,请使用show errors作为a_horse_with_no_name suggests。这显示了任何编译错误,这对于跟踪它们非常有用。