PL/SQL - 将索引状态从不可用变为有效的存储过程

PL/SQL - Stored Procedure that turn indexes status from UNUSABLE to VALID

我有一个游标,returns 从 user_indexesstatus = 'UNUSABLE' 索引并在输出选项卡中打印它们:

DECLARE
    cur sys_refcursor;
BEGIN
    FOR iStat IN (SELECT INDEX_NAME FROM USER_INDEXES WHERE STATUS = 'UNUSABLE' ORDER BY INDEX_NAME) LOOP
            DBMS_OUTPUT.PUT_LINE('ALTER INDEX '||iStat.INDEX_NAME||' REBUILD');
    END LOOP;
END;

这些是 return:

的一些索引列表
ALTER INDEX II_LKP_DRV_POLRIECUB_REA_MISC REBUILD;
ALTER INDEX IND1_CM_FACT_RVA_COMISION REBUILD;
ALTER INDEX IND2_CM_FACT_RVA_COMISION REBUILD;
ALTER INDEX INDX_SN_FACT_RECLA_ADJ_SINI REBUILD;

我做了一个存储过程来对这些索引 return 在光标处执行 alter table(我只使用了 2 个索引用于测试目的):

CREATE OR REPLACE PROCEDURE status_index
AS
cur sys_refcursor;

BEGIN
    FOR iStat IN (SELECT INDEX_NAME FROM USER_INDEXES WHERE INDEX_NAME IN ('II_LKP_DRV_POLRIECUB_REA_MISC', 'INDX_SN_FACT_RECLA_ADJ_SINI') AND STATUS = 'UNUSABLE' ORDER BY INDEX_NAME) LOOP
            'ALTER INDEX ' || iStat.INDEX_NAME || ' REBUILD';
    END LOOP;  
END;

如果我使用 DBMS_OUTPUT.PUT_LINE 它可以工作,但是如果我在 运行 该过程时使用 ALTER INDEX,它会抛出以下错误:

ORA-06550: line 2, column 5
PLS-00905: object ECCO_A.STATUS_INDEX is invalid
ORA-06550: line 2, column 5
PL/SQL: Statement ignored

如果有人能帮我解决这个错误,我将不胜感激。

alter index 语句是数据定义语言语句。如果您使用动态 SQL,它只能 运行 在 DML(数据操作语言)block/procedure/function 中。您的 DML 还充当隐式提交,如果这是正在执行的代码块链中的一个,您可能会感到惊讶。

BEGIN
    FOR iStat IN (SELECT INDEX_NAME FROM USER_INDEXES 
 WHERE INDEX_NAME IN ('II_LKP_DRV_POLRIECUB_REA_MISC', 
 'INDX_SN_FACT_RECLA_ADJ_SINI') 
 AND STATUS = 'UNUSABLE' 
 ORDER BY INDEX_NAME) 
LOOP
               EXECUTE IMMEDIATE 'ALTER INDEX ' || iStat.INDEX_NAME || ' REBUILD';
        END LOOP;  
    END;

参见here and here。您还可以考虑首先处理导致索引无法使用的任何问题,因为这可能使您不需要进行此维护。