Oracle 重建所有表的索引的存储过程 (重建索引)

CREATE OR REPLACE PROCEDURE P_REBUILD_ALL_INDEX(TABLESPACE_NAME IN VARCHAR2, --这里是表空间名,如果不改变表空间,可以传入NULL
ONLY_UNUSABLE IN BOOLEAN) --是否仅对无效的索引操作
AS
SQLT VARCHAR(200);
BEGIN
--只取非临时索引
FOR IDX IN (SELECT INDEX_NAME, TABLESPACE_NAME, STATUS
FROM USER_INDEXES
WHERE TEMPORARY = 'N') LOOP
--如果是如重建无效的索引,且当索引不是无效时,则跳过
IF ONLY_UNUSABLE = TRUE AND IDX.STATUS <> 'UNUSABLE' THEN
GOTO CONTINUE;
END IF;

IF (TABLESPACE_NAME IS NULL) OR IDX.STATUS = 'UNUSABLE' THEN
--如果没有指定表空间,或索引无效,则在原表空间重建
SQLT := 'ALTER INDEX ' || IDX.INDEX_NAME || ' REBUILD ';
ELSIF UPPER(TABLESPACE_NAME) <> IDX.TABLESPACE_NAME THEN
--如果指定的不同的表空间,则在指定表空间待建索引
SQLT := 'ALTER INDEX ' || IDX.INDEX_NAME || ' REBUILD TABLESPACE ' ||
TABLESPACE_NAME;
ELSE
--如果表空间相同,则跳过
GOTO CONTINUE;
END IF;

DBMS_OUTPUT.PUT_LINE(IDX.INDEX_NAME);
EXECUTE IMMEDIATE SQLT;
<<CONTINUE>>
NULL;
END LOOP;
END;
/*
功能:重建索引。
说明:如果表空间参数传入NULL,则在原表空间内重建索引,否则在目标表空间重建索引。
如果表空间相同,则跳过。
ONLY_UNUSABLE表示是否只对无效的索引进行重建
作者:81, 2007年6月26日
*/

你可能感兴趣的:(oracle)