重建所有表的索引的儲存過程
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日
*/