2014-12-05 77 views
-1

CREATE INDEX我們有表所有者名稱和索引所有者名稱不匹配。我們需要刪除索引以及與其相關的約束,並在特定模式中重新創建索引以匹配索引所有者和表所有者名稱。我們有不同的列數,每個索引從1到4不等。 我需要創建一個同時刪除n個重新創建的過程。DROP,並在同一時間

declare 
total number(10); 
table_name varchar2(255); 
index_name varchar2(255); 
column_name varchar2(255); 
begin 
select a.table_name, a.index_name,count(a.column_name) into table_name, index_name,total 
from all_ind_columns a, all_indexes b where a.index_name = b.index_name 
and b.table_owner = 'SIM'and b.owner like 'TIM' 
group by a.table_name,a.index_name 
order by a.table_name,a.index_name,count(a.column_name); 
select c.column_name into column_name from all_ind_columns c,all_indexes d 
where c.index_name=d.index_name 
and d.table_owner='SIM' and d.owner like 'TIM'; 
for i in (select a.table_name, a.index_name,count(a.column_name) from all_ind_columns a, all_indexes b where a.index_name = b.index_name 
and b.table_owner = 'SIM'and b.owner like 'TIM' 
group by a.table_name,a.index_name 
order by a.table_name,a.index_name,count(a.column_name)) 
loop 
If i.count(a.column_name)=1 then 
DBMS_OUTPUT.PUT_LINE ('Create index'||index_name|| 'on' ||table_name||'('||Column_name||')'); 
else total>=2 
then 
DBMS_OUTPUT.PUT_LINE ('Create index'||index_name|| 'on' ||table_name||'('||Column_name,Column_name||')'); 
end if; 
end loop; 
end; 
+0

這是什麼問題? – DoctorMick 2014-12-05 14:34:31

回答

1

DBMS_METADATA是重新生成對象DDL的官方方式。通常比手動創建DDL語句要好。有數百個用於創建索引的選項,DBMS_METADATA.GET_DDL是確保您準確重新創建對象的唯一方法。

declare 
    v_index_ddl clob; 
begin 
    for indexes_in_wrong_schema in 
    (
     select table_name, index_name 
     from all_indexes 
     where table_owner = 'SIM' and owner like 'TIM' 
    ) loop 
     v_index_ddl := dbms_metadata.get_ddl('INDEX', 
      indexes_in_wrong_schema.index_name, 'TIM'); 
     --Or replace these with "execute immediate" to run instead of print. 
     dbms_output.put_line('drop index TIM.'|| 
      indexes_in_wrong_schema.index_name); 
     dbms_output.put_line(replace(v_index_ddl, '"TIM"', '"SIM"')); 
    end loop; 
end; 
/

特權

DBMS_METADATA需要你要麼有SELECT_CATALOG_ROLE或正在執行的模式所有者。詢問DBA或其他特權用戶是否可以授予您該角色。或者將上面的PL/SQL塊轉換爲函數,將函數安裝在所有者的模式中,然後grant execute on new_function to your_user;

+0

感謝您UR support.Canü請elobarate我DIS v_index_ddl:= DBMS_METADATA.GET_DDL( '索引',indexes.index_name, 'TIM');當我跑這個查詢我收到以下錯誤ORA:31603:Object'name」 typeINDEX的架構中未找到‘TIM’​​ – 2014-12-08 07:23:34

+0

@SamadRaza見有固定的語法更新的答案,關於DBMS_METADATA一些更多的信息。 – 2014-12-08 08:06:59

+0

我有一些privelge相關的問題,我不能使用dbms_metadata你可以請幫助我與這一些動態查詢 – 2014-12-08 10:29:23