You don't say how you are passing these records to the database. The best way is to use an array, as this allows the use of Oracle's plenty of nifty FORALL bulk operations.
This example package has two procedures. One which populates a collection of T23 records (a table which comprises five numeric columns) and one which bulk inserts records into that table using an array.
SQL> create or replace package p23 as 2 type t23_nt is table of t23%rowtype; 3 function pop_array ( p_no in number ) 4 return t23_nt; 5 procedure ins_table ( p_array in t23_nt ); 6 end p23; 7 / Package created. SQL> create or replace package body p23 as 2 3 function pop_array ( p_no in number ) 4 return t23_nt 5 is 6 return_value t23_nt; 7 begin 8 select level,level,level,level,level 9 bulk collect into return_value 10 from dual 11 connect by level <= p_no; 12 return return_value; 13 end pop_array; 14 15 procedure ins_table 16 ( p_array in t23_nt ) 17 is 18 s_time pls_integer; 19 begin 20 21 s_time := dbms_utility.get_time; 22 23 forall r in p_array.first()..p_array.last() 24 insert into t23 25 values p_array(r); 26 27 dbms_output.put_line('loaded ' 28 ||to_char(p_array.count())||' recs in ' 29 ||to_char(dbms_utility.get_time - s_time) 30 ||' csecs'); 31 end ins_table; 32 end p23; 33 / Package body created. SQL>
Here is the output from some sample runs:
SQL> declare 2 l_array p23.t23_nt; 3 begin 4 l_array := p23.pop_array(500); 5 p23.ins_table(l_array); 6 l_array := p23.pop_array(1000); 7 p23.ins_table(l_array); 8 l_array := p23.pop_array(2500); 9 p23.ins_table(l_array); 10 l_array := p23.pop_array(5000); 11 p23.ins_table(l_array); 12 l_array := p23.pop_array(10000); 13 p23.ins_table(l_array); 14 l_array := p23.pop_array(100000); 15 p23.ins_table(l_array); 16 end; 17 / loaded 500 recs in 0 csecs loaded 1000 recs in 0 csecs loaded 2500 recs in 0 csecs loaded 5000 recs in 1 csecs loaded 10000 recs in 1 csecs loaded 100000 recs in 15 csecs PL/SQL procedure successfully completed. SQL> SQL> select count(*) from t23 2 / COUNT(*) ---------- 119000 SQL>
I think inserting 100,000 records in 0.15 seconds should please all but the most demanding of users. So, the question is, how do you approach your inserts?