我希望触发器在每个插入的记录之后运行。
如果我有一个像这样的简单插入,这个验证工作正常:
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值(...))时,我没有这个问题。
我该如何避免这个问题? 感谢。
答案 0 :(得分:1)
在这里,您应该更改查询并插入SELECT ... FROM some join
的结果,而不是使用触发器。您希望在插入表X
时,触发器也插入到同一个表中,这是不可能的(它会递归)。
如果无法更改查询,则应重命名表,使用旧名称创建表的视图,然后创建TRIGGER INSTEAD OF INSERT ON that view FOR EACH ROW
INSERT INTO into the real table
的结果SELECT ... FROM some join
。
答案 1 :(得分:0)
如果您使用的是Oracle 11G,则可以查看复合触发器以避免变异表错误。看一看: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD