0

我有 for in 循环来重建某些已更改主键的表的索引。无论如何要从与inUSER_OBJECTS链接中选择这些表的索引,也可以排除任何 IOT 表的索引。TABLE_NAMEUSER_TABLES

 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

4

2 回答 2

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,但它可能对调试有用。

当然,您首先需要质疑为什么要重建所有索引...

于 2018-04-23T11:29:06.343 回答
1
select * from user_tables where iot_type is not null;

将返回索引组织的表。

正如我所说,在使用索引时,请考虑查询USER_INDEXES

于 2018-04-23T11:28:29.097 回答