Sauter au contenu

Eviter ORA-14400 avec Interval Partitions

5 mars 2010

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')
Pas encore de commentaires

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Gravatar
Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 36 followers