Check user_tab_cols to get a precise list of the columns (hidden and otherwise).
Then you need to create an exchange table that has those exact attributes (or you modify the primary table to "clean" it up).
eg
SQL> desc PAR
Name Null? Type
----------------------------- -------- --------------------
X NUMBER(10)
Y NUMBER(10)
SQL> select partition_name
2 from user_tab_partitions
3 where table_name = 'PAR';
PARTITION_NAME
------------------------------------------------------------
P1
P2
2 rows selected.
SQL> create table EXCH_PAR
2 as select * from PAR
3 where 1=0;
Table created.
SQL> desc EXCH_PAR
Name Null? Type
----------------------------- -------- --------------------
X NUMBER(10)
Y NUMBER(10)
SQL> alter table PAR exchange partition P1
2 with table EXCH_PAR;
alter table PAR exchange partition P1
*
ERROR at line 1:
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE
SQL> select column_id, column_name, data_type
2 from user_tab_cols
3 where table_name = 'PAR';
COLUMN_ID COLUMN_NAME DATA_TYPE
---------- ------------------------------ ---------
1 X NUMBER
SYS_C00002_16083109:09:55$ DATE
2 Y NUMBER
--
-- because originally the table was like this , and then I marked a column unused
--
SQL> desc PAR
Name Null? Type
----------------------------- -------- -----------
X NUMBER(10)
Z DATE
Y NUMBER(10)
SQL> alter table PAR set unused column Z;
SQL> create table EXCH_PAR (
2 x number(10),
3 dummy date ,
4 y number(10));
Table created.
SQL> alter table EXCH_PAR set unused column dummy;
Table altered.
SQL> alter table PAR exchange partition P1
2 with table EXCH_PAR;
Table altered.
But its not *just* unused column - could be virtual columns, function based indexes, stats extensions etc etc....Until 12.2, you need to replicate the "internal" things that have happened exactly