declare
l_cnt number;
TYPE t_forall_test_tab IS TABLE OF forall_test%ROWTYPE;
l_tab t_forall_test_tab := t_forall_test_tab();
l_start NUMBER;
l_size NUMBER := 10000;
insert_string varchar2(2000);
begin
-- Populate collection.
FOR i IN 1 .. l_size LOOP
l_tab.extend;
l_tab(l_tab.last).id := i;
l_tab(l_tab.last).code := TO_CHAR(i);
l_tab(l_tab.last).description := 'Description= ' || TO_CHAR(i);
END LOOP;
EXECUTE IMMEDIATE 'TRUNCATE TABLE forall_test';
l_start := dbms_utility.get_time;
FOR i IN l_tab.first .. l_tab.last LOOP
insert_string:='INSERT /*'||i||'*/ INTO forall_test (id, code, description) VALUES ('||l_tab(i).id||','||l_tab(i).code||','''||l_tab(i).description||''')';
execute immediate insert_string;
END LOOP;
dbms_output.put_line( 'Hard Parse :'||(dbms_utility.get_time-l_start) || ' hsecs ( units in 1/100 of a secs)' );
EXECUTE IMMEDIATE 'TRUNCATE TABLE forall_test';
-- Soft parse each statement as every insert statement the same.
EXECUTE IMMEDIATE 'ALTER SESSION SET cursor_sharing = FORCE';
l_start := dbms_utility.get_time;
FOR i IN l_tab.first .. l_tab.last LOOP
insert_string:='INSERT INTO forall_test (id, code, description) VALUES ('||l_tab(i).id||','||l_tab(i).code||','''||l_tab(i).description||''')';
execute immediate insert_string;
END LOOP;
dbms_output.put_line( 'Soft Parse :'||(dbms_utility.get_time-l_start) || ' hsecs ( units in 1/100 of a secs)' );
EXECUTE IMMEDIATE 'TRUNCATE TABLE forall_test';
l_start := dbms_utility.get_time;
FORALL i IN l_tab.first .. l_tab.last
INSERT INTO forall_test VALUES l_tab(i);
DBMS_OUTPUT.put_line('Bulk Inserts : ' ||
(DBMS_UTILITY.get_time - l_start)||' hsecs ( units in 1/100 of a secs)');
COMMIT;
end;