or would be bette to transfer required data to temporary table and back again?

Code:
SQL> SET TIMING ON
SQL> CREATE TABLE my_table as SELECT * FROM all_objects;

Table created.

Elapsed: 00:00:09.86
SQL> INSERT INTO my_table SELECT * FROM my_table;

24700 rows created.

Elapsed: 00:00:03.38
SQL> /

49400 rows created.

Elapsed: 00:00:08.07
SQL> /

98800 rows created.

Elapsed: 00:00:13.14
SQL> /

197600 rows created.

Elapsed: 00:00:20.69
SQL>  SELECT COUNT(1) FROM my_table;

  COUNT(1)
----------
    395200

Elapsed: 00:00:03.85
SQL> CREATE TABLE my_table2 AS SELECT * FROM my_table WHERE ROWNUM < 30000;

Table created.

Elapsed: 00:00:02.84
SQL> 
SQL> TRUNCATE TABLE my_table;

Table truncated.

Elapsed: 00:00:00.61
SQL> INSERT INTO my_table SELECT * FROM my_table2;

29999 rows created.

Elapsed: 00:00:02.80
SQL> DROP TABLE my_table2;

Table dropped.

Elapsed: 00:00:02.64
SQL> 
SQL> SELECT COUNT(1) FROM my_table;

  COUNT(1)
----------
     29999

Elapsed: 00:00:00.85
SQL>