若是用户多个表中的索引由于某种原因,导致了多表的索引失效的情况下,
如果我们一个一个表的去检查并修复它的的索引,无疑是增加的工作量,如果
使用游标for循环就很容易解决,以下是演示过程。
---使用for游标修复用户表中损坏的索引:
--创建两个测试表:
suxing@PROD>create table t3 as select * from all_objects
2 where rownum<=20;
Table created.
suxing@PROD>create table t4 as select * from all_objects
2 where rownum<=50;
Table created.
#两个测试表已经创建成功:
--给两个测试表各创建创建一个索引:
suxing@PROD>create index idx_t3 on t3(object_id);
Index created.
suxing@PROD>create index idx_t4 on t4(object_id);
Index created.
#索引创建成功:
--查看两个表的索引状态:
suxing@PROD>select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
IDX_T4 VALID
IDX_T3 VALID
#可见两个表的索引处于正常状态。
--移动两个表致使两个表的所以失效:
suxing@PROD>alter table t3 move;
Table altered.
suxing@PROD>alter table t4 move;
Table altered.
#已做移动操作。
--再次查看两个表的索引状态:
suxing@PROD>select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
IDX_T4 UNUSABLE
IDX_T3 UNUSABLE
#表移动之后导致表中的索引失效。
--使用for游标修复用户的所有表失效的索引:
suxing@PROD>begin
2 for i in (select index_name,status from user_indexes where status='UNUSABLE') loop
3 execute immediate 'alter index '||i.index_name||' rebuild online';
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
#程序执行完成。
--再次查看两个表的索引状态:
suxing@PROD>select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
IDX_T4 VALID
IDX_T3 VALID
#索引已经修复。
这样,就几步的操作,就完成多个表失效索引的修复。