2011-10-26 47 views
0

我正在寫一個觸發器的問題。我想做一個簡單的觸發器,其中狀態字段設置爲'已發送'的表STATEMENT更新後,它會在表中創建一個新行,其中字段如id,日期,用戶和最後一個字段爲需要某些字段值來創建「通知」的消息。SQL/Oracle 10g - 觸發器故障/從表中獲取值

如果它會幫助,我的發言表包含以下字段:

  • ID
  • 列表項
  • 標題
  • 其他不知道

所以需要時使用要插入的通知的最後一個字段,我想創建一個消息,也許說「(聲明,(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的字段值?

任何幫助表示讚賞

回答

3

可以使用參考新的語句列值觸發:新的,並把它們連接成你的文字:

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; 
+0

這很有效!非常感謝你:)也感謝模板方法。這確實不那麼令人困惑。 – George