Depuis l’introduction de la version 11gR1, il est possible de convertir une « range partition table » en une « interval partition table » pour éviter des exceptions ORA-14400 quand une valeur insérée ne correspond à aucune partition.
Voyons comment :
Par exemple :
SQL> CREATE TABLE DEMO_DATA_RANGE (
EMPID number(4) not null,
start_date DATE,
Job varchar2(30)
)
PARTITION BY RANGE (start_date)
(
PARTITION DEMO_DATA_P0 VALUES LESS THAN (TO_DATE('1-1-2009', 'DD-MM-YYYY')),
PARTITION DEMO_DATA_P1 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY'))
);
SQL> INSERT INTO "NRTDB"."DEMO_DATA_RANGE" (EMPID, START_DATE, JOB)
VALUES ('100', TO_DATE('1-1-2010', 'DD-MM-YYYY'), 'DBA')
INSERT INTO "NRTDB"."DEMO_DATA_RANGE" (EMPID, START_DATE, JOB)
VALUES ('100', TO_DATE('1-1-2010', 'DD-MM-YYYY'), 'DBA')
ERREUR à la ligne 1 :
ORA-14400 : la clé de partition insérée ne correspond à aucune partition
Une solution pour éviter le problème ci-dessous est de convertir la range partition table en un interval partition utilisant la nouvelle commande SET INTERVAL ().
Par exemple pour convertir la table DEMO_DATA_RANGE un interval partition par mois :
Alter Table DEMO_DATA_RANGE set INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'));
Maintenant si nous essayons d’insérer la même ligne, ça passe.
SQL> INSERT INTO "NRTDB"."DEMO_DATA_RANGE" (EMPID, START_DATE, JOB) VALUES ('100', TO_DATE('1-1-2010', 'DD-MM-YYYY'), 'DBA') 1 lignes inséré Commit;
Avec interval partition Oracle crée automatiquement les nouvelles partitions quand il y a une valeur insérée qui ne correspond à aucune partition. Le nom de cette partition est automatiquement généré par Oracle.
SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'DEMO_DATA_RANGE'; TABLE_NAME PARTITION_NAME HIGH_VALUE DEMO_DATA_RANGE DEMO_DATA_P0 TO_DATE('2009-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA') DEMO_DATA_RANGE DEMO_DATA_P1 TO_DATE(' 2010-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA') DEMO_DATA_RANGE SYS_P259406 TO_DATE('2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA')