reference partitioning can certainly handle hierarchies of any level.
p = grandparent of c2
c1 = child of p
c2 = grandchild of p, but also child of c1
If a child inherits the partitioning scheme of the parent, then any child of the child will inherit the same.
ops$tkyte%ORA11GR2> 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%ORA11GR2> create table c1
2 ( order# number not null,
3 line# number,
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%ORA11GR2> create table c2
2 ( order# number not null,
3 line# number not null,
4 subline# number,
5 data varchar2(30),
6 constraint c2_pk primary key(order#,line#,subline#),
7 constraint c2_fk_c1 foreign key(order#,line#) references c1
8 )
9 enable row movement
10 partition by reference(c2_fk_c1)
11 /
Table created.
ops$tkyte%ORA11GR2> select table_name, partition_name
2 from user_tab_partitions
3 where table_name in ( 'P', 'C1', 'C2' )
4 order by table_name, partition_name
5 /
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
C1 PART_2007
C1 PART_2008
C2 PART_2007
C2 PART_2008
P PART_2007
P PART_2008
6 rows selected.