ORA-14758: Last partition in the range section cannot be dropped

今天发现oracle11g中用oracle自动创建分区的新功能后,删除旧分区报ORA-14758: Last partition in the range section cannot be dropped错误。

oracle对此错误的解释是:

ORA-14758: Last partition in the range section cannot be dropped
Cause: An attempt was made to drop the last range partition of an interval partitioned table.
Action: Do not attempt to drop this partition.

实验如下:

1.创建自动分区的表:

SQL> create table TB_DYNA_TABLE
(
  NUM                        NUMBER,
  NAME                       VARCHAR2(30),
  CRT_TIME                   DATE not null
)
partition by range (CRT_TIME)
interval(numtodsinterval(1,'DAY'))
(PARTITION P20120919 VALUES LESS THAN (TO_DATE(' 2012-09-20 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));
根据创建时间按天创建分区表。

插入几条数据:

SQL>
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(1,'DONGCS1',TO_DATE('2012-09-15','YYYY-MM-DD'));
 
1 row inserted
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(2,'DONGCS2',TO_DATE('2012-09-20','YYYY-MM-DD'));
 
1 row inserted
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(3,'DONGCS3',TO_DATE('2012-09-21','YYYY-MM-DD'));
 
1 row inserted
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(4,'DONGCS4',TO_DATE('2012-09-22','YYYY-MM-DD'));
 
1 row inserted
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(5,'DONGCS5',TO_DATE('2012-09-23','YYYY-MM-DD'));
 
1 row inserted
SQL> INSERT INTO TB_DYNA_TABLE(NUM,NAME,CRT_TIME)
  2  VALUES(6,'DONGCS6',TO_DATE('2012-09-24','YYYY-MM-DD'));
 
1 row inserted
 
SQL> commit;
 
Commit complete

查询数据情况:

SQL> select * from TB_DYNA_TABLE;
 
       NUM NAME                           CRT_TIME
---------- ------------------------------ -----------
         1 DONGCS1                        2012-9-15
         2 DONGCS2                        2012-9-20
         3 DONGCS3                        2012-9-21
         4 DONGCS4                        2012-9-22
         5 DONGCS5                        2012-9-23
         6 DONGCS6                        2012-9-24
 
6 rows selected

查询表的分区信息:

SQL> SELECT t.table_name,t.partition_name,t.partition_position FROM User_Tab_Partitions t WHERE t.table_name='TB_DYNA_TABLE';
 
TABLE_NAME                     PARTITION_NAME                 PARTITION_POSITION
------------------------------ ------------------------------ ------------------
TB_DYNA_TABLE                  P20120919                                       1
TB_DYNA_TABLE                  SYS_P61                                         2
TB_DYNA_TABLE                  SYS_P63                                         3
TB_DYNA_TABLE                  SYS_P62                                         4
TB_DYNA_TABLE                  SYS_P65                                         5
TB_DYNA_TABLE                  SYS_P64                                         6
 
6 rows selected

删除第一个分区看看:

SQL> alter table TB_DYNA_TABLE drop partition P20120919;
 
alter table TB_DYNA_TABLE drop partition P20120919
 
ORA-14758: Last partition in the range section cannot be dropped

看来第一个分区删不了。
 删除其他分区看看:

SQL>  alter table TB_DYNA_TABLE drop partition SYS_P61;
 
Table altered
 
SQL> alter table TB_DYNA_TABLE drop partition SYS_P63;
 
Table altered

其他分区可以删除。

查询表的分区信息:

SQL> SELECT t.table_name,t.partition_name,t.partition_position FROM User_Tab_Partitions t WHERE t.table_name='TB_DYNA_TABLE';
 
TABLE_NAME                     PARTITION_NAME                 PARTITION_POSITION
------------------------------ ------------------------------ ------------------
TB_DYNA_TABLE                  P20120919                                       1
TB_DYNA_TABLE                  SYS_P62                                         2
TB_DYNA_TABLE                  SYS_P65                                         3
TB_DYNA_TABLE                  SYS_P64                                         4
总结:

1.建表时需要指定第一个初始化的分区

2.插入数据后,分区根据插入的数据自动分区了;

3.删除第一个分区删除不了,只能删除之后的分区。

另外还需注意:如果表有索引且不是分区索引,删除分区后(分区里面且有数据),那么需要重建索引。

 

请使用浏览器的分享功能分享到微信等