我有for循环来重建已更改主键的某些表的索引。无论如何,只从USER_OBJECTS
中TABLE_NAME
链接USER_TABLES
来选择这些表的索引,也排除任何IOT表的索引。
FOR r IN (SELECT OBJECT_NAME AS OBJ FORM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX') LOOP
l_sql := 'ALTER INDEX '||r.obj||' REBUILD'||'';
EXECUTE IMMEDIATE l_sql;
END LOOP;
上面的代码只是简单地重建架构中的所有索引(包括IOT,因此命中错误ORA-28650: Primary index on an IOT cannot be rebuilt
)
答案 0 :(得分:4)
我根本不会使用user_objects
;为什么不从user_indexes
开始,并将其加入user_tables
?
select ui.index_name from user_indexes ui
join user_tables ut on ut.table_name = ui.table_name
where ut.iot_type is null
所以你的循环变成了:
FOR r IN (
select ui.index_name from user_indexes ui
join user_tables ut on ut.table_name = ui.table_name
where ut.iot_type is null
)
LOOP
l_sql := 'ALTER INDEX "'||r.index_name||'" REBUILD';
EXECUTE IMMEDIATE l_sql;
END LOOP;
您真的不需要l_sql
,但它可能对调试有用。
当然,您需要先质疑为什么要重建所有索引...
答案 1 :(得分:1)
select * from user_tables where iot_type is not null;
将返回索引组织表。
正如我所说,在使用索引时,请考虑查询USER_INDEXES
。