2011-10-13 236 views
2

我希望觸發器在插入每條記錄後運行。如何在每次插入後觸發觸發器 - Oracle(批量插入)

此驗證工作正常,如果我有一個簡單的插入這樣的:

insert into g_dossier values 
       (112334, 'BBT', 'LPO','TTS','Y') ; 

然而,當它就像一個批量插入這樣的:

INSERT INTO g_piece(
       refpiece, 
       typpiece, 
       class_piece 
       group_piece 
       flag_piere)  
SELECT   :new.element_num, 
       PROC_TYPE, 
       DECODE(piece_it, 'F', 'FTTR', 'N', 'FTTR', NULL), 
       DECODE(piece_it, 'T', 'TTSN', 'N', 'TTSN', NULL), 
       'N' 
FROM t_elements 
WHERE :new.db_piece_flag = 'Y'; 

觸發變異。我希望驗證在作爲批量插入完成時也可以工作。

造成這個問題的查詢

SELECT COUNT(*) 
INTO existing_cmcl_cnt 
FROM g_piece cmcl 
WHERE cmcl.class_piece= :new.class_piece 

的問題是,這個查詢被稱爲應用在同一個表「g_piece」觸發。當我進行一個簡單的插入(插入g_piece值(...))時,我沒有這個問題。

我該如何避免這個問題? 謝謝。

回答

1

在這裏您應該更改查詢並插入SELECT ... FROM some join的結果,根本不使用觸發器。你希望在插入表X時,觸發器也插入到同一個表中,這是不可能的(它會遞歸)。

如果你不能改變的查詢,您應該重命名錶,創建視圖與舊名稱的表格,並創建一個TRIGGER INSTEAD OF INSERT ON that view FOR EACH ROWINSERT INTO into the real table一個SELECT ... FROM some join的結果。