CREATE TABLE TAB1
(
“TAB1_KEY” NUMBER,
“NUMB1″Â Â Â Â NUMBER,
“ACTION_DT” DATE,
“USER_ID”    VARCHAR2(60 BYTE),
“ACTION”     VARCHAR2(1500 BYTE)
);
CREATE TABLE TAB_HIST
(
“ACTION_DT” DATE,
“USER_ID”    VARCHAR2(60 BYTE),
“ACTION”     VARCHAR2(1500 BYTE)
);
– Compound Trigger
create or replace
TRIGGER TRG_TAB1_INSERT
FOR INSERT ON TAB1
COMPOUND TRIGGER
BEFORE STATEMENT IS
BEGIN
INSERT INTO TAB_HIST(ACTION_DT,USER_ID,action) VALUES(SYSDATE,’Trigger’,'START BEFORE STATEMENT’);
–Â Â Â NULL; — Do something here.
INSERT INTO TAB_HIST(ACTION_DT,USER_ID,action) VALUES(SYSDATE,’Trigger’,'END BEFORE STATEMENT’);
END BEFORE STATEMENT;
BEFORE EACH ROW IS
BEGIN
INSERT into TAB_HIST(ACTION_DT,USER_ID,action) values(sysdate,’Trigger’,'START BEFORE EACH ROW’);
–
INSERT into TAB_HIST(ACTION_DT,USER_ID,action) values(sysdate,’Trigger’,'END BEFORE EACH ROW’);
END BEFORE EACH ROW;
AFTER EACH ROW IS
BEGIN
INSERT into TAB_HIST(ACTION_DT,USER_ID,action) values(sysdate,’Trigger’,'STARTÂ AFTER EACH ROW’);
INSERT INTO TAB_HIST(ACTION_DT,USER_ID,action) VALUES(SYSDATE,’Trigger’,'END AFTER EACH ROW’);
END AFTER EACH ROW;
AFTER STATEMENT IS
BEGIN
INSERT into TAB_HIST(ACTION_DT,USER_ID,action) values(sysdate,’Trigger’,'START AFTER STATEMENT’);
INSERT into TAB_HIST(ACTION_DT,USER_ID,action) values(sysdate,’Trigger’,'END AFTER STATEMENT’);
END AFTER STATEMENT;
END TRG_TAB1_INSERT;
– Test execution of the inserts in loop
BEGIN
FORÂ i in 1..5
LOOP
INSERT INTO TAB1 (TAB1_KEY,ACTION_DT,ACTION) values(123,sysdate,’Tested’);
END LOOP;
COMMIT;
END;
/
in 11gR2:
SQL> select count(*) from TAB_HIST;
COUNT(*)
———-
40
in 11.1.0.7
SQL> select count(*) from TAB_HIST;
COUNT(*)
———-
8
11.1.0.7, version has lot of know bug with compound triggers.
This issue is fixed in below patch,
Patch 8850303: ORA-600 [PEVMEXE.C: BREAK: BUG 281522 : HIT OPCODE BREAK] – COMPOUND TRIGGER