2017-01-16 4 views
0

J'essaie de faire une partition d'échange sur une base de données et j'ai l'erreur suivante: ORA-14097: type de colonne ou incompatibilité de taille dans ALTER TABLE EXCHANGE PARTITIONType de colonne d'échange de partition ou incompatibilité de taille (ORA-14097)

Le script qui fait cela a déjà été créé et il est en cours d'exécution comme prévu sur une base de données Oracle 11g. Dès que j'ai mis à jour vers 12c j'ai ce problème. Voilà comment je fais l'échange de partition:

-- The new partitioned table. 
CREATE TABLE NEW_TABLE 
(
    id    NUMBER(18) NOT NULL, 
    message  VARCHAR2(4000) NOT NULL, 
    details  VARCHAR2(4000), 
    partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL 
) NOCOMPRESS LOGGING 
    PARTITION BY RANGE (partition_time) INTERVAL (NUMTODSINTERVAL(1,'HOUR')) 
    (PARTITION initial VALUES LESS THAN (to_timestamp('01-01-2016','dd-mm- yyyy HH24:MI'))); 

-- The old table. 
CREATE TABLE OLD_TABLE 
(
    id   NUMBER(18,0) NOT NULL, 
    message   VARCHAR2(4000 byte) NOT NULL, 
    details   VARCHAR2(4000), 
); 

-- Add the column that does not exist on the old table (keep the same columns). 
ALTER TABLE OLD_TABLE ADD partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL; 

ALTER TABLE NEW_TABLE 
EXCHANGE PARTITION INITIAL 
WITH TABLE OLD_TABLE 
WITHOUT VALIDATION; 

(...) 

Maintenant, encore une fois, sur Oracle 11g cela fonctionnait parfaitement. Sur Oracle 12c, j'ai l'erreur expliquée ci-dessus. J'ai fait des recherches et j'ai vu des gens parler de colonnes INVISIBLES. Eh bien, j'ai recréé le OLD_TABLE donc je pense qu'il n'y aura pas de colonnes invisibles.

EDIT:

Je me suis rendu compte que sur Oracle 12c lorsque je tente de modifier la table pour créer une nouvelle colonne est créée une autre colonne invisible (appelée SYS_NC00011 $). C'est pourquoi l'échange de partition ne fonctionne pas. Ma question maintenant est de savoir pourquoi cela se passe et quelle est la meilleure façon de «supprimer cette colonne»? Déjà essayé de supprimer des colonnes inutilisées sans succès.

Merci les gars!

+0

Pourriez-vous avoir un groupe de colonnes pour prendre en charge les statistiques corrélées? – BobC

Répondre

0

La plus évidente est que NEW_TABLE a une colonne PARTITION_TIME, contrairement à OLD_TABLE. Les autres choses à vérifier, que pourrait être un problème

  • NEW_TABLE.ID est NUMBER (18,0), tandis que OLD_TABLE.ID est NUMBER (18)
  • OLD_TABLE.MESSAGE est VARCHAR2 (4000 octet). Vous devriez vérifier votre sémantique de longueur
    , car si elles sont définies comme CHAR, alors
    NEW_TABLE.message serait VARCHAR2 (4000 char).