PL/SQL - 将索引状态从不可用变为有效的存储过程
PL/SQL - Stored Procedure that turn indexes status from UNUSABLE to VALID
我有一个游标,returns 从 user_indexes
和 status = '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。您还可以考虑首先处理导致索引无法使用的任何问题,因为这可能使您不需要进行此维护。
我有一个游标,returns 从 user_indexes
和 status = '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。您还可以考虑首先处理导致索引无法使用的任何问题,因为这可能使您不需要进行此维护。