SQL / Oracle 10g - 使用触发器/从表中获取值来解决问题

时间:2011-10-26 13:16:23

标签: sql oracle plsql

我目前正在处理我正在编写的触发器问题。我想做一个简单的触发器,在更新表STATEMENT并将状态字段设置为'Sent'之后,它将在表NOTICE中创建一个新行,其中包含id,date,user和最后一个字段为a的字段消息,它使某些字段值创建“通知”。

如果有帮助,我的STATEMENT表包含以下字段:

  • id
  • 列表项
  • 标题
  • 其他人不需要知道

因此,在插入NOTICE的最后一个字段时,我想创建一条消息,或许可以说“发送日期时发出的声明,(id) - (标题)”。

我目前有:

create trigger send_notice
    after update on STATEMENT
    for each row
    when (new.status = 'Sent')
begin
    insert into NOTICE values (notice_seq.nextval, SYSDATE, '10001', 'the notice 
    im having trouble constructing');
end send_notice;

我在数据库中测试了这个触发器,一切似乎都运行正常。我只是想知道的另一件事是格式化或是否有任何遗漏可能有助于此触发器?而且,我是否会创建该通知,它从STATEMENT获取字段值?

感谢任何帮助

1 个答案:

答案 0 :(得分:3)

您可以使用以下命令在触发器中引用新的STATEMENT列值:new。,并将它们连接到您的文本中:

create trigger send_notice
    after update on STATEMENT
    for each row
    when (new.status = 'Sent')
begin
    insert into NOTICE values (notice_seq.nextval, SYSDATE, '10001',
     'The statement, ' || :new.id || ' - ' || :new.title || ', issued on '
     || :new.issue_date || ' has been sent');
end send_notice;

有时连接大量文本和值会让人感到困惑,您可能会发现使用这种“模板”方法更容易:

create trigger send_notice
    after update on STATEMENT
    for each row
    when (new.status = 'Sent')
declare
    l_text varchar2(500);
begin
    l_text := 'The statement, #ID# - #TITLE#, issued on #DATE# has been sent';
    l_text := replace (l_text, '#ID#', :new.id);
    l_text := replace (l_text, '#TITLE#', :new.title);
    l_text := replace (l_text, '#DATE#', :new.issue_date);
    insert into NOTICE values (notice_seq.nextval, SYSDATE, '10001', l_text);
end send_notice;