And how long does it take when you run it serially? And how long using DIY parallel? How are you getting these times?
If the current process is taking too long, rather than going for DIY parallel and hoping it'll make things faster
figure out why it's slow serially.
Do this by tracing the application while it runs:
exec DBMS_monitor.session_trace_enable ( null, null, true, true );
***your code here***
exec DBMS_monitor.session_trace_disable;
You can read more about this at:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof It's likely using this you can find where to make gains on serial execution. For starters, there's nested cursor for loops. I'm sure moving these to set processing will help.