How large is the insertion? You could do it in pl/sql and just commit every 1000 records or so. That would also be a lot nicer to your rollback segments, which might by why sqlplus is hanging. Check the alert log and you might see some unable to extend errors.

In any case here's a sample pl/sql block
<font face="courier">
declare
&nbsp;&nbsp;cursor cur is select col1, col5, col3
&nbsp;&nbsp;from tableB b, tableC
&nbsp;&nbsp;c where b.col4=c.col4;
&nbsp;i NUMBER;
begin
&nbsp;&nbsp;i = 0;
&nbsp;&nbsp;for rec in cur loop
&nbsp;&nbsp;&nbsp;&nbsp;insert into tableA values (rec.col1, rec.col5, rec.col3);
&nbsp;&nbsp;&nbsp;&nbsp;if ( mod(1,1000) == 0 ) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commit;
&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp;&nbsp;&nbsp;i := i+1;
&nbsp;&nbsp;end loop;
&nbsp;&nbsp;commit;
end;

that's off the top of my head so syntax is probablly shaky but you get the idea.