If you want to put the entire table into 1 of the system partitions, you can do a direct exchange
SQL> create table t ( x int, y int );
Table created.
SQL>
SQL> insert into t select rownum, rownum from dual
2 connect by level <= 1500;
1500 rows created.
SQL>
SQL> create table t1 ( x int, y int )
2 partition by system
3 (
4 partition p1,
5 partition p2
6 )
7 /
Table created.
SQL>
SQL> alter table t1 exchange partition p1 with table t;
Table altered.
If you have a rule that defines the system partitions, and the rule can be expressed by the data, then you could do it in a 2 step process. Let's say your system partition rule is:
"if x+y < 500 then partition p1, else p2"
you could so something like this:
SQL> create table t ( x int, y int );
Table created.
SQL>
SQL>
SQL> insert into t select rownum, rownum from dual
2 connect by level <= 1500;
1500 rows created.
SQL>
SQL> alter table t add partcol varchar2(2) invisible generated always as ( case when x+y < 500 then 'p1' else 'p2' end ) ;
Table altered.
SQL>
SQL> alter table T modify
2 partition by list (partcol)
3 (
4 partition p1 values ('p1'),
5 partition p2 values ('p2')
6 ) online
7 /
Table altered.
SQL>
SQL> create table t1 ( x int, y int )
2 partition by system
3 (
4 partition p1,
5 partition p2
6 )
7 /
Table created.
SQL>
SQL> create table t2 ( x int , y int, partcol varchar2(2) invisible generated always as ( case when x+y < 500 then 'p1' else 'p2' end ) );
Table created.
SQL>
SQL> alter table t exchange partition p1 with table t2;
Table altered.
SQL> alter table t1 exchange partition p1 with table t2;
Table altered.
SQL>
SQL> alter table t exchange partition p2 with table t2;
Table altered.
SQL> alter table t1 exchange partition p2 with table t2;
Table altered.
which would be minimal downtime.