您是否在存储过程使用的同一会话中发出 ALTER SESSION 语句?还是 ALTER SESSION 在单独的会话中执行?
您可以使用动态 SQL 将 ALTER SESSION 嵌入到您的 PL/SQL 中,即
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.