2

我希望触发器在插入的每条记录之后运行。

如果我有这样的简单插入,则此验证工作正常:

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 值(...))时,我没有这个问题。

我怎样才能避免这个问题?谢谢。

4

2 回答 2

1

在这里,您应该更改查询并插入 a 的结果SELECT ... FROM some join,而不是使用触发器。您希望在插入 table 时X,触发器也会插入同一个表,这是不可能的(它会递归)。

如果您无法更改查询,您应该重命名您的表,使用旧名称创建表的视图,并TRIGGER INSTEAD OF INSERT ON that view FOR EACH ROW 创建INSERT INTO into the real table一个SELECT ... FROM some join.

于 2011-10-13T15:10:17.977 回答
0

如果您使用的是 Oracle 11G,则可以查看复合触发器以避免变异表错误。看看:http: //download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD

于 2011-10-13T11:11:35.583 回答