Tom Kyte's OraMag article was the starting point for my investigations, and can be found here.
After running the set up script below, the new 12c TRUNCATE CASCADE
command can be used:
  ALTER TABLE orders TRUNCATE PARTITION sys_p541 CASCADE;
After running the partition exchange set up script further below, the new 12c
EXCHANGE PARTITION CASCADE command can be used to PEL the ORDERS_TMP table and child LINE_ITEMS_TMP
table into the ORDERS and LINE_ITEMS partitioned tables:
  ALTER TABLE orders EXCHANGE PARTITION p0 WITH TABLE orders_tmp CASCADE;
Noteably, the PEL does the comprehensive job of exchanging all the stats all the way up/down the
heirarchy PEL'd.
CREATE TABLE orders ( order# NUMBER PRIMARY KEY, order_date DATE, data VARCHAR2(3) ) ENABLE ROW MOVEMENT PARTITION BY RANGE(ORDER_DATE) INTERVAL (NUMTODSINTERVAL(1, 'day')) (PARTITION p0 VALUES LESS THAN (date '2013-01-01')) / CREATE TABLE line_items ( order# NUMBER NOT NULL, line# NUMBER, data VARCHAR2(3), CONSTRAINT line_items_pk PRIMARY KEY (order#, line#), CONSTRAINT line_items_fk1 FOREIGN KEY (order#) REFERENCES orders ON DELETE CASCADE ) ENABLE ROW MOVEMENT PARTITION BY REFERENCE(line_items_fk1) / INSERT INTO orders (order#, order_date, data) VALUES (1, date '2014-01-15', 'xxx'); INSERT INTO line_items (order#, line#, data) VALUES (1, 1, 'yyy'); COMMIT; BEGIN DBMS_STATS.gather_table_stats(user, 'ORDERS'); DBMS_STATS.gather_table_stats(user, 'LINE_ITEMS'); END; / COLUMN table_name FORMAT a10; COLUMN partition_name FORMAT a10; SELECT table_name, partition_name, num_rows, blocks FROM user_tab_partitions WHERE table_name IN ('ORDERS', 'LINE_ITEMS');
CREATE TABLE orders_tmp ( order# NUMBER PRIMARY KEY, order_date DATE, data VARCHAR2(3) ) / CREATE TABLE line_items_tmp ( order# NUMBER NOT NULL, line# NUMBER, data VARCHAR2(3), CONSTRAINT line_items_tmp_pk PRIMARY KEY (order#, line#), CONSTRAINT line_items_tmp_fk1 FOREIGN KEY (order#) REFERENCES orders_tmp ON DELETE CASCADE ) / INSERT INTO orders_tmp (order#, order_date, data) VALUES (3, date '2012-06-01', 'Tmp'); INSERT INTO line_items_tmp (order#, line#, data) VALUES (3, 1, 'tmp'); COMMIT; BEGIN DBMS_STATS.gather_table_stats(user, 'ORDERS'); DBMS_STATS.gather_table_stats(user, 'LINE_ITEMS'); DBMS_STATS.gather_table_stats(user, 'ORDERS_TMP'); DBMS_STATS.gather_table_stats(user, 'LINE_ITEMS_TMP'); END; / COLUMN table_name FORMAT a13; COLUMN partition_name FORMAT a10; SELECT table_name, num_rows, blocks FROM user_tables WHERE table_name IN ('ORDERS_TMP', 'LINE_ITEMS_TMP'); SELECT table_name, partition_name, num_rows, blocks FROM user_tab_partitions WHERE table_name IN ('ORDERS', 'LINE_ITEMS'); PROMPT Exchange partitions ALTER TABLE orders EXCHANGE PARTITION p0 WITH TABLE orders_tmp CASCADE; SELECT table_name, num_rows, blocks FROM user_tables WHERE table_name IN ('ORDERS_TMP', 'LINE_ITEMS_TMP'); SELECT table_name, partition_name, num_rows, blocks FROM user_tab_partitions WHERE table_name IN ('ORDERS', 'LINE_ITEMS');