Проблема с COMPOUND TRIGGER

Vipous
Дата: 28.03.2011 16:21:23
drop COMPOUND_TR_TEST;
create table COMPOUND_TR_TEST(n number);

create or replace trigger COMPOUND_TR_TEST_TR
 FOR UPDATE OF n
  or delete
  or insert ON COMPOUND_TR_TEST
COMPOUND TRIGGER

   idx pls_integer:=0;

   BEFORE STATEMENT IS
   BEGIN
      NULL;
   END BEFORE STATEMENT;

   BEFORE EACH ROW IS
   BEGIN
      NULL;
   END BEFORE EACH ROW;

   AFTER EACH ROW IS
   BEGIN     
      idx:=idx+1;      
   END AFTER EACH ROW;

   AFTER STATEMENT IS
   BEGIN
     dbms_output.put_line('СТРОК - '||idx);
   END AFTER STATEMENT;
END COMPOUND_TR_TEST_TR;
/

set serveroutput on;
set echo off;
set heading off;
begin
   for i in 1..10
    loop
      insert into COMPOUND_TR_TEST values(i);
    end loop;
end;
/
rollback;

Вот код, в цикле вставляется 10 строк, но триггер срабатывает только один раз. На первой вставке, можно это както исправить или это баг оракла?

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for 64-bit Windows: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SQL>
-2-
Дата: 28.03.2011 16:28:35
Vipous,

А где результат dbms_output?
comphead
Дата: 28.03.2011 16:29:36
Vipous,

поди еще количество строк выводит 0, да?
Vipous
Дата: 28.03.2011 16:50:03
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 
Connected as piter_small
 
SQL> 
drop table COMPOUND_TR_TEST;
 
drop table COMPOUND_TR_TEST
 
ORA-00942: таблица или представление пользователя не существует
create table COMPOUND_TR_TEST(n number);
 
Table created
 
Executed in 0,031 seconds
create or replace trigger COMPOUND_TR_TEST_TR
 FOR UPDATE OF n
  or delete
  or insert ON COMPOUND_TR_TEST
COMPOUND TRIGGER
 
   idx pls_integer:=0;
 
   BEFORE STATEMENT IS
   BEGIN
      NULL;
   END BEFORE STATEMENT;
 
   BEFORE EACH ROW IS
   BEGIN
      NULL;
   END BEFORE EACH ROW;
 
   AFTER EACH ROW IS
   BEGIN
      idx:=:new.n;
   END AFTER EACH ROW;
 
   AFTER STATEMENT IS
   BEGIN
     dbms_output.put_line('СТРОК - '||idx);
   END AFTER STATEMENT;
END COMPOUND_TR_TEST_TR;
/
 
Trigger created
 
Executed in 0,032 seconds
set serveroutput on;
set echo off;
 
СТРОК - 1
 
PL/SQL procedure successfully completed
 
Executed in 0,015 seconds
 
Rollback complete
 
Executed in 0,016 seconds
 
Table dropped
 
Executed in 0,141 seconds
 
SQL> 
Vipous
Дата: 28.03.2011 16:52:53
Для сравнения
declare
  i number:=1;
begin
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);
   i:=i+1;
   insert into COMPOUND_TR_TEST values(i);   
   i:=i+1;
end;
/


СТРОК - 1
СТРОК - 2
СТРОК - 3
СТРОК - 4
СТРОК - 5
СТРОК - 6
СТРОК - 7
СТРОК - 8
СТРОК - 9
СТРОК - 10

PL/SQL procedure successfully completed
_Nikotin
Дата: 28.03.2011 17:16:18
на 11.2 всё нормально, на 11.1 wrong result.
Vipous
Дата: 28.03.2011 17:22:10
Спасибо, так и думал.
-2-
Дата: 28.03.2011 17:23:48
Сравнить результаты при:
alter session set plsql_optimize_level=0,1,2,3
_Nikotin
Дата: 28.03.2011 17:24:26
-2-
Сравнить результаты при:
alter session set plsql_optimize_level=0,1,2,3

никак не влияет, это проблема не plsql
Vipous
Дата: 28.03.2011 17:53:59
пробовал вставлять коммит, обернуть вставку в процедуру, и процедуру с автономной транзакцией, результат один - плохой