Usually, the database vendors maintain and supply their bulk loading utility for a reason - you can't beat sqlldr (or in my case, isql) for their raw loading speed. They are able to circumvent some of the API restrictions that the rest of the database interface needs to follow.

I recommend you look into writing the control file and then shell out to sqlldr to load your data. A templating system will make generating the control file very convenient.

A second route could be to see whether Oracle supports something like LOAD TABLE..., that is, an SQL/DBI interface to sqlldr. That will likely only work on the machine where the database process lives, but you could get a nicer API for error reporting that way than when parsing command output.