はい、エラーメッセージはやや誤解を招きますが、最後に静的に作成されたパーティションを参照しています(Oracleがパーティションの自動作成を開始する前の元のテーブルDDL内)。これを回避する唯一の方法は、人工的な「MINVAL」パーティションを作成することだと思います決して使用されないことが確実であり、実際のパーティションをこれより上にドロップします。
【意見交換後編集】
このテストケースで問題が再現されると思います:
CREATE TABLE test
( t_time DATE
)
PARTITION BY RANGE (t_time)
INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('09-1-2009', 'MM-DD-YYYY')),
PARTITION p1 VALUES LESS THAN (TO_DATE('09-2-2009', 'MM-DD-YYYY')),
PARTITION p2 VALUES LESS THAN (TO_DATE('09-3-2009', 'MM-DD-YYYY')),
PARTITION p3 VALUES LESS THAN (TO_DATE('09-4-2009', 'MM-DD-YYYY'))
);
insert into test values(TO_DATE('08-29-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-1-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-3-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-10-2009', 'MM-DD-YYYY'));
これを行うと、パーティション p0、p1、および p2 を削除できますが、p3 を削除しようとすると、システムによって生成されたパーティションがこれを超える場合でもエラーが発生します。
私が見つけた唯一の回避策は、次の方法でテーブルのパーティション分割を一時的に再定義することでした。
alter table test set interval ();
次に、パーティション p3 を削除します。次に、元の仕様に従ってパーティショニングを再定義できます。
alter table test set INTERVAL(NUMTODSINTERVAL(1, 'DAY'));