如何将 USER_TABLES 与 USER_OBJECTS 中的相应索引连接起来?

How to join USER_TABLES with its corresponding indexes in USER_OBJECTS?

我有 for in 循环来重建某些 table 已更改主键的索引。无论如何,select 只有来自 USER_OBJECTS 的这些 table 的索引与 USER_TABLES 中的 TABLE_NAME 链接,还要排除任何 IOT table 的索引.

 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

select * from user_tables where iot_type is not null;

将return个索引组织表。

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

我根本不会使用 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,但它可能对调试有用。

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