For a millions you could chunk this up a little, eg
SQL> create table t1 ( x int, y int, z int );
Table created.
SQL> create table t2 as select * from t1;
Table created.
SQL>
SQL> insert into t1
2 select rownum, rownum, rownum
3 from dual connect by level <= 100;
100 rows created.
SQL>
SQL>
SQL> declare
2 cursor c is select rowid rid, t1.* from t1;
3 type array is table of c%rowtype index by pls_integer;
4 l_rows array;
5 l_idx int;
6 begin
7 open c;
8 loop
9 fetch c bulk collect into l_rows limit 1000;
10 exit when l_rows.count = 0;
11
12 forall i in 1 .. l_rows.count
13 insert into t2 values (
14 l_rows(i).x,
15 l_rows(i).y,
16 l_rows(i).z );
17 forall i in 1 .. l_rows.count
18 delete from t1
19 where rowid = l_rows(i).rid;
20 end loop;
21 end;
22 /
PL/SQL procedure successfully completed.