2011-10-13 238 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的结果。