Eviter ORA-14400 avec Interval Partitions

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')