有没有办法通过存储过程/plsql 重建每个模式中的每个索引?

Is there a way to rebuild every index in every schema through stored procedure / plsql?

似乎无法想出一个存储过程来在线重建数据库中每个模式中的每个索引。我只是在这方面不是很清楚。

create or replace procedure rebuild_indexes(
    p_owner in varchar2,
    p_table_name in varchar2
) as
begin
    for indexes_to_rebuild in
    (
        select index_name
        from all_indexes
        where owner = p_owner
        and table_name = p_table_name
    ) loop
        execute immediate 'alter index '||p_owner||'.'
            ||indexes_to_rebuild.index_name||' rebuild online';
    end loop;
end;
/

您可以通过稍微修改参数并查询 ALL_INDEXES

来尝试这样的过程
DECLARE
    PROCEDURE rebuild_indexes (p_owner        IN VARCHAR2 DEFAULT NULL,
                               p_table_name   IN VARCHAR2 DEFAULT NULL)
    AS
    BEGIN
        FOR indexes_to_rebuild
            IN (SELECT owner, index_name
                  FROM all_indexes
                 WHERE owner = NVL (p_owner, owner) AND table_name = NVL (p_table_name, table_name))
        LOOP
            BEGIN
                EXECUTE IMMEDIATE   'alter index '
                                 || indexes_to_rebuild.owner
                                 || '.'
                                 || indexes_to_rebuild.index_name
                                 || ' rebuild online';
            EXCEPTION
                WHEN OTHERS
                THEN
                    DBMS_OUTPUT.put_line (
                           'Failed to rebuild index '
                        || indexes_to_rebuild.owner
                        || '.'
                        || indexes_to_rebuild.index_name
                        || ': '
                        || SQLERRM);
            END;
        END LOOP;
    END;
BEGIN
    --Rebuild all indexes on a table
    rebuild_indexes (p_owner => 'APEX_190200', p_table_name => 'WWV_FLOWS');
    --Rebuild all indexes in a schema
    rebuild_indexes (p_owner => 'APEX_190200', p_table_name => NULL);
    --Rebuild all indexes
    rebuild_indexes (p_owner => NULL, p_table_name => NULL);
END;
/