现在的位置: 首页 > 综合 > 正文

Oracle批量修改用户表table的表空间

2018年04月07日 ⁄ 综合 ⁄ 共 1705字 ⁄ 字号 评论关闭

一、修改用户表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段》后只好无奈地放弃!

抱歉!评论已关闭.