您的位置:首页 > 数据库 > Oracle

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

2011-06-21 18:40 399 查看
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 存储 null user