1. 程式人生 > >Oracle批量修改使用者表table的表空間

Oracle批量修改使用者表table的表空間

一、修改使用者表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類:NORMALFUNCTION-BASED NORMALLOB,除index_type為LOB型別的索引狀態為VALID外,NORMAL、FUNCTION-BASED NORMAL

型別的索引狀態均被設定為不可用狀態了UNUSABLE

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段》後只好無奈地放棄!