Can you try converting the inserts to pure SQL ?. This is the fastest and cleanest approach to downloading large amounts of data.
After you are set up, row_source generation can be done by Cartesian processing of the result.
For example: first let's say that your table has
EmpNo, EmpName, Sal 1000 , Mark , 500 1001 , Jorja , 100
I want to generate the contents of a table 3 times, then I will do the following
insert into emp select (select max(empno) from emp )+lvl as empNo , empName , Sal from emp join (select level as lvl from dual connect by level<=3 )row_source_generation on 1=1;
This will give the following conclusion
EmpNo, EmpName, Sal 1000 , Mark , 500 1001 , Jorja , 100 1002 , Mark1 , 500 1003 , Jorja1 , 100 1004 , Mark2 , 500 1005 , Jorja2 , 100 1006 , Mark3 , 500 1007 , Jorja3 , 100