This is from 18.3
SQL> create or replace trigger TRG_DETAIL_TABLE
2 for insert or delete or update on table_detail
3 compound trigger
4
5 type rpar is record (
6 id number,
7 operacao varchar2(1)
8 );
9 type tpar is table of rpar;
10 vpar tpar := tpar();
11
12 before statement is
13 begin
14 null;
15 end before statement;
16
17 before each row is
18 begin
19 null;
20 end before each row;
21
22 after each row is
23 begin
24 vpar.extend;
25 vpar(vpar.last).id := nvl(:new.id,:old.id);
26 vpar(vpar.last).operacao :=
27 case when inserting then 'I'
28 when deleting then 'E'
29 else 'A' end;
30 Dbms_Output.Put_Line('AFTER EACH ROW ' || vpar.count);
31 end after each row;
32
33 after statement is
34 begin
35 Dbms_Output.Put_Line('AFTER STATEMENT ' || vpar.count);
36 end after statement;
37 end;
38 /
Trigger created.
SQL>
SQL> set serveroutput on
SQL> delete from table_master where parent_id = 1;
AFTER EACH ROW 1
AFTER EACH ROW 2
AFTER STATEMENT 0
1 row deleted.