ストアドプロシージャが使用しているのと同じセッションでALTERSESSIONステートメントを発行していますか?または、そのALTER SESSIONは別のセッションで実行されますか?
動的SQLを使用してPL/SQLにALTERSESSIONを埋め込むことができます。
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';
<<more code>>
END;
一部のインデックスは一意ですか(または一意の制約を適用するために使用されますか)?skip_unusable_indexesのドキュメントに記載されているように
注:インデックスを使用してテーブルにUNIQUE制約を適用する場合、テーブルで挿入および更新操作を許可すると、制約に違反する可能性があります。したがって、この設定では、一意の使用できないインデックスのエラーレポートは無効になりません。
その場合、制約を無効にしたり、インデックスを非一意に変更したりできますか?
一意のインデックスと一意でないインデックスの違いの簡単なサンプル。使用できない一意のインデックスがある場合、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.