Yes, you can exchange across tablespaces. This will just change the pointers. So in effect this flips the location of the table and partition involved:
create tablespace tbsp datafile 'tbsp.dbf' size 10M;
create table t (
x int,
y int
) tablespace tbsp;
create table tpart (
x int,
y int
) partition by range (x) (
partition p0 values less than (10)
);
insert into t values (1, 2);
insert into tpart values (1, 2);
commit;
select segment_name, tablespace_name, bytes, partition_name
from user_segments
where segment_name in ('T', 'TPART');
SEGMENT_NAME TABLESPACE_NAME BYTES PARTITION_NAME
T TBSP 65,536
TPART SYSTEM 16,384 P0
select object_name, object_id, data_object_id from user_objects
where object_name in ('T', 'TPART');
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
T 82,991 82,991
TPART 82,992
TPART 82,993 82,993
alter table tpart exchange partition p0 with table t;
select segment_name, tablespace_name, bytes, partition_name
from user_segments
where segment_name in ('T', 'TPART');
SEGMENT_NAME TABLESPACE_NAME BYTES PARTITION_NAME
TPART TBSP 65,536 P0
T SYSTEM 16,384
select object_name, object_id, data_object_id from user_objects
where object_name in ('T', 'TPART');
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
TPART 82,993 82,991
TPART 82,992
T 82,991 82,993