Oracle批量修改使用者表table的表空間
阿新 • • 發佈:2019-01-09
一、修改使用者表table的表空間
1、修改使用者表table的表空間:alter table 表名 move tablespace 新表空間名;
2、查詢所有使用者表:select * from user_tables;
【指令碼】
查詢當前使用者的所有的資料表,並把表空間為“EAS_D_HFY_STANDARD”的使用者表,修改為:EAS_D_HFY120929_STANDARD。
/* Formatted on 2012-10-11 14:17:04 (QP5 v5.115.810.9015) */ DECLARE i_count INT := 0; execsql VARCHAR2 (1000); CURSOR c_mysql IS SELECT 'alter table ' || table_name || ' move tablespace EAS_D_HFY120929_STANDARD' mysql FROM user_all_tables WHERE tablespace_name = 'EAS_D_HFY_STANDARD'; BEGIN FOR r_mysql IN c_mysql LOOP DBMS_OUTPUT.put_line (r_mysql.mysql); EXECUTE IMMEDIATE r_mysql.mysql; i_count := i_count + 1; END LOOP; DBMS_OUTPUT.put_line ('i_count: ' || i_count); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ( '異常:' || 'sqlcode:' || SQLCODE || ' sqlerrm : ' || SQLERRM ); END;
二、修改索引index的表空間
【問題】
修改表table的表空間後,在操作相關表時,遇到ORA-01502問題:
ORA-01502: index 'HFY120401.PK_MULTIAPPROVE' or partition of such index is in unusable state
【分析】
1、經過系統分析,查詢索引狀態,可發現索引“PK_MULTIAPPROVE”的狀態是“UNUSABLE”;
2、進一步分析,發現系統中的索引index_type有3類:NORMAL、FUNCTION-BASED NORMAL、LOB,除index_type為LOB型別的索引狀態為VALID外,NORMAL、FUNCTION-BASED NORMAL
3、分析索引的語句如下:
select index_name,index_type,tablespace_name,table_type,status from user_indexes;
【指令碼】
查詢當前使用者所有非LOB索引,並把表空間為“EAS_D_HFY_STANDARD”的索引,更新為:EAS_D_HFY120929_STANDARD。
/* Formatted on 2012-10-11 14:31:42 (QP5 v5.115.810.9015) */ DECLARE i_count INT := 0; CURSOR c_mysql IS SELECT 'alter index ' || index_name || ' rebuild tablespace EAS_D_HFY120929_STANDARD' mysql FROM user_indexes WHERE tablespace_name = 'EAS_D_HFY_STANDARD' and index_type<>'LOB'; BEGIN FOR r_mysql IN c_mysql LOOP DBMS_OUTPUT.put_line (r_mysql.mysql); EXECUTE IMMEDIATE r_mysql.mysql; i_count := i_count + 1; END LOOP; DBMS_OUTPUT.put_line ('i_count: ' || i_count); END;
關於ORA-01502的問題,詳見:《ORA-01502錯誤成因和解決方法》
其實重建普通索引成功後,也試著努力更新LOB索引的,只是在詳細閱讀《如何重建LOB型別的索引和LOB段》後只好無奈地放棄!