In 11g, you will have "by reference" partitioning which permits this operation.
ops$tkyte%ORA11GR1> create table p
2 (
3 order# number primary key,
4 order_date date,
5 data varchar2(30)
6 )
7 enable row movement
8 PARTITION BY RANGE (order_date)
9 (
10 PARTITION part_2007 VALUES LESS THAN (to_date('01-jan-2008','dd-mon-yyyy')) ,
11 PARTITION part_2008 VALUES LESS THAN (to_date('01-jan-2009','dd-mon-yyyy'))
12 )
13 /
Table created.
ops$tkyte%ORA11GR1> create table c1
2 ( order# number not null, -- the NOT NULL is necessary, even though part of the
3 line# number, -- key
4 data varchar2(30),
5 constraint c1_pk primary key(order#,line#),
6 constraint c1_fk_p foreign key(order#) references p
7 )
8 enable row movement
9 partition by reference(c1_fk_p)
10 /
Table created.
ops$tkyte%ORA11GR1> insert into p (order#, order_date, data)
2 values ( 1, to_date('31-dec-2007'), 'order data' );
1 row created.
ops$tkyte%ORA11GR1> insert into p (order#, order_date, data)
2 values ( 2, to_date('01-jan-2008'), 'order data' );
1 row created.
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> insert into c1 (order#, line#, data)
2 values ( 1, 1, 'line data 1' );
1 row created.
ops$tkyte%ORA11GR1> insert into c1 (order#, line#, data)
2 values ( 1, 2, 'line data 2' );
1 row created.
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> insert into c1 (order#, line#, data)
2 values ( 2, 1, 'line data 1' );
1 row created.
ops$tkyte%ORA11GR1> insert into c1 (order#, line#, data)
2 values ( 2, 2, 'line data 2' );
1 row created.
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> select * from p;
ORDER# ORDER_DAT DATA
---------- --------- ------------------------------
1 31-DEC-07 order data
2 01-JAN-08 order data
ops$tkyte%ORA11GR1> select * from c1;
ORDER# LINE# DATA
---------- ---------- ------------------------------
1 1 line data 1
1 2 line data 2
2 1 line data 1
2 2 line data 2
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> alter table p truncate partition part_2007;
alter table p truncate partition part_2007
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
ops$tkyte%ORA11GR1> alter table c1 truncate partition part_2007;
Table truncated.
ops$tkyte%ORA11GR1> alter table p truncate partition part_2007;
Table truncated.
ops$tkyte%ORA11GR1>
ops$tkyte%ORA11GR1> select * from p;
ORDER# ORDER_DAT DATA
---------- --------- ------------------------------
2 01-JAN-08 order data
ops$tkyte%ORA11GR1> select * from c1;
ORDER# LINE# DATA
---------- ---------- ------------------------------
2 1 line data 1
2 2 line data 2
prior to that, disabling the foreign key is the only option.