Oracle 12c Partition Exchange/Truncate Cascade

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.

Partition Table Setup

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

Partition Exchange Table Setup

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