2017-01-16 24 views
0

データベースで交換パーティションを実行しようとしていて、次のエラーが発生しました。ORA-14097:ALTER TABLE EXCHANGEで列の型またはサイズの不一致Oracle 11gのデータベースで期待どおりにPARTITIONパーティション交換型またはサイズの不一致(ORA-14097)

これはすでに作成された実行するスクリプト、それを走っていました。私が12cに更新するとすぐに、私はこの問題を抱えています。パーティション交換を行う方法は次のとおりです。

-- 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; 

(...) 

ここでもまた、Oracle 11gではこれが完全に機能していました。 Oracle 12cでは、上記のエラーが発生しました。私はいくつかの研究を行いました。私は人々が不可解な列について話しているのを見ました。さて、私はOLD_TABLEを再作成しているので、目に見えない列はないと思います。

EDIT:

私は、Oracle 12cの上で私は(SYS_NC00011 $という名前の)別の不可視の列が作成された新しい列を作成するには、テーブルを変更しようとすることを実現しました。パーティション交換が機能しないのはこのためです。私の質問は、なぜこれが起こっているのか、そして「このコラムを削除する」最良の方法は何ですか?既に使用されていない列を削除して成功しません。

ありがとう!

+0

関連する統計情報をサポートする列グループがありますか。 – BobC

答えて

0

最も明白なのは、NEW_TABLEにはPARTITION_TIME列があり、OLD_TABLEにはPARTITION_TIME列がないことです。 OLD_TABLE.IDはNUMBER(18)である問題になる

  • NEW_TABLE.IDは、NUMBER(18,0)である可能性があることを確認する 他のもの、
  • OLD_TABLE.MESSAGEはVARCHAR2(4000ありますバイト)。
    の長さセマンティクスは、CHARとして定義されている場合、
    NEW_TABLE.messageはVARCHAR2(4000文字)になるため、チェックする必要があります。