Вы выполняете инструкцию ALTER SESSION в том же сеансе, который использует хранимая процедура? Или это ALTER SESSION выполняется в отдельном сеансе?
Вы можете встроить ALTER SESSION в PL / SQL с помощью динамического SQL, т.е.
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';
<<more code>>
END;
Являются ли некоторые индексы уникальными (или используются для принудительного применения уникального ограничения)? В документации skip_unusable_indexes указано
Примечание. Если индекс используется для принудительного
УНИКАЛЬНОЕ ограничение на стол, то
разрешение операций вставки и обновления
на столе может нарушить
ограничение. Поэтому этот параметр
не отключает отчеты об ошибках для
непригодные индексы, которые являются уникальными.
Если это так, можете ли вы отключить ограничение и / или изменить индекс (ы) на неуникальные?
Быстрый образец различия между уникальными и неуникальными индексами. Обратите внимание, что если у вас есть неиспользуемый уникальный индекс, skip_unusable_indexes не подавляет ошибку ORA-01502, как при использовании неиспользуемого неуникального индекса.
SQL> create table a (
2 col1 number
3 );
Table created.
SQL> create unique index idx_a on a( col1 );
Index created.
SQL> insert into a values( 1 );
1 row created.
SQL> commit;
Commit complete.
SQL> alter index idx_a unusable;
Index altered.
SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state
SQL> alter session set skip_unusable_indexes = true;
Session altered.
SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state
SQL> drop index idx_a;
Index dropped.
SQL> create index idx_a_nonunique on a( col1 );
Index created.
SQL> alter index idx_a_nonunique unusable;
Index altered.
SQL> insert into a values( 2 );
1 row created.