"ora-01502 索引或這類索引的分區處於不可用狀態"的解決方案

如題,在ORACLE中自動新增刪除分區以後,會報出ora-01502的錯誤。sql

首先,問題的緣由是在於進行表結構修改後,索引失效。問題解決有以下幾個方式:oop

一、手動查詢重建測試

(1)先查詢失效索引,語句爲:ui

      select index_name ,status  from user_indexes where Status = 'UNUSABLE' ;

(2)重建索引,語句爲: spa

  
alter index  xxx rebuild;

手動操做有個快捷的方式,能夠將上面的步驟合成爲一個查詢語句:   code

 select 'alter index ' || index_name || ' rebuild;' from user_indexes where Status = 'UNUSABLE' ;

這樣直接複製查詢出來的語句手動執行便可。
索引

二、將上面的手動操做作成存儲過程執行的「只能自動」table

(1)建立重建索引的存儲過程,語句以下:class

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;

(2) 建立執行重建的存儲過程select

CREATE OR REPLACE PROCEDURE EXEC_REBUILD_PROC AS
    v_err_num  NUMBER;  --ORA錯誤號
   v_err_msg  VARCHAR2(100); --錯誤描述
BEGIN
 --10表明建立10天的分區,tablespace表明表空間名
 p_rebuild_all_index(NULL,true);
 COMMIT;
EXCEPTION
 WHEN OTHERS THEN
  v_err_num := SQLCODE;
  v_err_msg := SUBSTR(SQLERRM, 1, 100);
  dbms_output.put_line('EXEC_REBUILD_PROC執行出現異常,錯誤碼='|| v_err_num || '錯誤描述=' || v_err_msg);
END EXEC_REBUILD_PROC;

如此便可。以上方式均已測試可用。

相關文章
相關標籤/搜索