simple test-case for 11.2.0.4 and 12.1.0.1 on linux x64:
connect / as sysdba drop user u21 cascade; create user u21 identified by u21 default tablespace users temporary tablespace temp; grant create session, create table to u21; connect u21/u21 declare lv_statement varchar2(32000) := 'create table t1 ( '; ln_max_indexes pls_integer := 1000; ln_max_columns pls_integer := 1000; ln_max_ind_columns pls_integer := 32; begin for i in 1..ln_max_columns loop if i < ln_max_columns then lv_statement := lv_statement || ' c'||i||' number,'; else lv_statement := lv_statement || ' c'||i||' number'; end if; end loop; lv_statement := lv_statement || ')'; execute immediate lv_statement; for i in 1..ln_max_indexes loop execute immediate 'create index ii'||i||' on t1 ( c'||i||')'; end loop; execute immediate 'create index i1001 on t1 (c1,c2)'; end; / select count(*) from user_indexes; connect / as sysdba drop user u21 cascade; drop user u21 cascade * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-01418: specified index does not exist
ouch …
does not happen with 1000 indexes:
connect / as sysdba drop user u22 cascade; create user u22 identified by u22 default tablespace users temporary tablespace temp; grant create session, create table to u22; connect u22/u22 declare lv_statement varchar2(32000) := 'create table t1 ( '; ln_max_indexes pls_integer := 1000; ln_max_columns pls_integer := 1000; ln_max_ind_columns pls_integer := 32; begin for i in 1..ln_max_columns loop if i < ln_max_columns then lv_statement := lv_statement || ' c'||i||' number,'; else lv_statement := lv_statement || ' c'||i||' number'; end if; end loop; lv_statement := lv_statement || ')'; execute immediate lv_statement; for i in 1..ln_max_indexes loop execute immediate 'create index ii'||i||' on t1 ( c'||i||')'; end loop; end; / select count(*) from user_indexes; connect / as sysdba drop user u22 cascade;
happens again with 1002:
connect / as sysdba drop user u22 cascade; create user u22 identified by u22 default tablespace users temporary tablespace temp; grant create session, create table to u22; connect u22/u22 declare lv_statement varchar2(32000) := 'create table t1 ( '; ln_max_indexes pls_integer := 1000; ln_max_columns pls_integer := 1000; ln_max_ind_columns pls_integer := 32; begin for i in 1..ln_max_columns loop if i < ln_max_columns then lv_statement := lv_statement || ' c'||i||' number,'; else lv_statement := lv_statement || ' c'||i||' number'; end if; end loop; lv_statement := lv_statement || ')'; execute immediate lv_statement; for i in 1..ln_max_indexes loop execute immediate 'create index ii'||i||' on t1 ( c'||i||')'; end loop; execute immediate 'create index i1001 on t1 (c1,c2)'; execute immediate 'create index i1002 on t1 (c1,c2,c3)'; end; / select count(*) from user_indexes; connect / as sysdba drop user u22 cascade; drop user u22 cascade * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-01418: specified index does not exist
seems to be limit at 1000, somehow.
even more weird:
SYS@dbs101> select count(*) from dba_indexes where owner = 'U22'; COUNT(*) ---------- 0 SYS@dbs101> select count(*) from dba_objects where owner='U22'; COUNT(*) ---------- 996