ora-14400:插入的分区关键字未映射到任何分区。 过程如下: 首先创建一个分区表: create table TEST_INSER
(
ST_INSER_CODE VARCHAR2(20),
DT_INSER_WRITEDATE DATE
)
PARTITION BY RANGE(DT_INSER_WRITEDATE)
(
PARTITION jan2008 VALUES LESS THAN(TO_DATE('2008-2-1','YYYY-MM-DD')),
PARTITION feb2008 VALUES LESS THAN(TO_DATE('2008-3-1','YYYY-MM-DD')),
PARTITION mar2008 VALUES LESS THAN(TO_DATE('2008-4-1','YYYY-MM-DD')),
PARTITION apr2008 VALUES LESS THAN(TO_DATE('2008-5-1','YYYY-MM-DD')),
PARTITION may2008 VALUES LESS THAN(TO_DATE('2008-6-1','YYYY-MM-DD')),
PARTITION jun2008 VALUES LESS THAN(TO_DATE('2008-7-1','YYYY-MM-DD')),
PARTITION jul2011 VALUES LESS THAN(TO_DATE('2011-8-1','YYYY-MM-DD'))
); 然后将已经存在表T_INSER中的数据导入这个新建的分区表 SQL>INSERT INTO TEST_INSER SELECT * FROM T_INSER; 报ora-14400错误! 尝试如下: SQL>INSERT INTO TEST_INSER SELECT * FROM T_INSER WHERE DT_INSER_WRITEDATE IS NOT NULL; 依旧报错! SQL>ALTER TABLE TEST_INSER ENABLE ROW MOVEMENT; 依旧报错! SQL>ALTER TABLE TEST_INSER DROP PARTITION jul2011; SQL>ALTER TABLE TEST_INSER ADD PARTITION maxpart VALUES LESS THAN (MAXVALUE); 成功导入了! SQL>SELECT * FROM TEST_INSER PARTITION (maxpart); 检查一下最后一个partition中的数据,发现有DT_INSER_WRITEDATE有2028年的,原来不是NULL值惹的祸,我以为该字段有NULL值,所以开始才加了IS NOT NULL的过滤条件,仍旧导不进去,说明还是字段的值的确超出了现有的partition的值范围。至于那个ENABLE ROW MOVEMENT语句段,可以看这个例子: SQL>ALTER TABLE TEST_INSER DISABLE ROW MOVEMENT; SQL>UPDATE TEST_INSER SET DT_INSER_WRITEDATE=TO_DATE('2008-3-1','YYYY-MM-DD') WHERE TO_CHAR(DT_INSER_WRITEDATE,'YYYY') = '2028'; 报错!ORA-14402:更新分区关键字列将导致分区的更改 SQL>ALTER TABLE TEST_INSER ENABLE ROW MOVEMENT; SQL>UPDATE TEST_INSER SET DT_INSER_WRITEDATE=TO_DATE('2008-3-1','YYYY-MM-DD') WHERE TO_CHAR(DT_INSER_WRITEDATE,'YYYY') = '2028'; 成功!
|