分区表UNUSED列后的EXCHANGE PARTITION操作

碰到一个有意思的问题,如果分区表执行过SET UNUSED操作,那么是否还可以进行分区的EXCHANGE操作。
一个简单的测试就可以说明这个问题:

SQL> CREATE TABLE t_part_unused 
  2  (id NUMBER, name varchar2(30), other varchar2(30))
  3  partition BY range (id) 
  4  (partition p1 VALUES less than (10), 
  5  partition pmax VALUES less than (maxvalue));
TABLE created.
SQL> INSERT INTO t_part_unused 
  2  SELECT rownum, TABLE_NAME, 'abc' 
  3  FROM user_tables;
48 ROWS created.
SQL> commit;
Commit complete.
SQL> ALTER TABLE t_part_unused SET unused (other);
TABLE altered.
SQL> DESC t_part_unused
 Name                                     NULL?    TYPE
 ---------------------------------------- -------- ------------------------
 ID                                                NUMBER
 NAME                                              VARCHAR2(30)
SQL> CREATE TABLE t_temp_unused AS
  2  SELECT * 
  3  FROM t_part_unused
  4  WHERE 1 = 2;
TABLE created.
SQL> DESC t_temp_unused
 Name                                     NULL?    TYPE
 ---------------------------------------- -------- ------------------------
 ID                                                NUMBER
 NAME                                              VARCHAR2(30)
SQL> ALTER TABLE t_part_unused
  2  exchange partition p1
  3  WITH TABLE t_temp_unused;
WITH TABLE t_temp_unused
           *
ERROR at line 3:
ORA-14097: COLUMN TYPE OR SIZE mismatch IN ALTER TABLE EXCHANGE PARTITION
 
SQL> ALTER TABLE t_temp_unused ADD (other varchar2(30));
TABLE altered.
SQL> ALTER TABLE t_part_unused
  2  exchange partition p1
  3  WITH TABLE t_temp_unused;
WITH TABLE t_temp_unused
           *
ERROR at line 3:
ORA-14096: TABLES IN ALTER TABLE EXCHANGE PARTITION must have the same NUMBER OF COLUMNS
 
SQL> ALTER TABLE t_temp_unused SET unused (other);
TABLE altered.
SQL> ALTER TABLE t_part_unused
  2  exchange partition p1
  3  WITH TABLE t_temp_unused;
TABLE altered.

很明显执行了SET UNUSED操作后的表,和普通的表是存在区别的,这种区别导致要求进行EXCHANGE的表必须同样执行SET UNUSED操作,否则就无法执行EXCHANGE的操作。
当目标表中不包含SETE UNUSED的列时,EXCHANGE操作会出现ORA-14097的错误,而如果把列添加到目标表,则会报错ORA-14096,必须在目标表同样对列执行SET UNUSED操作,才能通过EXCHANGE之前的检查。
其实这也不难理解,执行SET UNUSED命令后,数据字典虽然发生了改变,但是表上的数据并没有删除,而EXCHANGE操作只是将两个段的数据字典进行互换,因此如果目标表上缺少SET UNUSED列,是无法执行EXCHANGE操作的。
解决问题的方法有两个,第一个就是例子中展示的可以在目标表上建立列然后同样的执行SET UNUSED操作;另外的一个方法就是对于SET UNUSED列执行DROP COLUMN操作,彻底删除该列。

This entry was posted in ORACLE and tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *