Hola,
No, no se puede hacer un commit cada n registros en un update directo.
Ahora no me queda claro cual es la preocupacion principal, es decir, si son los tiempos, entoces con un cursor haciendo un loop y commit cada 20.000 registros, por seguir tu ejemplo, tardara mucho mas que un update directo. Si el update tiene un buen plan de ejecucion, entonces sera lo mas rapido.
Si la preocupacion es el tamaño de la transaccion, y estas utilizando segmentos de rollback, entonces dimensiona un segmento acorde al tamaño de la transaccion y utiliza la siguiente intruccion para forzar el update a un segmento de rollback en especifico.
Código:
set transaction use rollback segment nombre_del_segmento_de_rollback;
Si estas utilizando segmentos de undo, dimensiona el tablespace de undo al tamaño de la transaccion y deja que Oracle se las arregle solo.
Si piensas que la operacion se atasca puedes consultar la vista v$session_longops (operaciones de mas de 6 segundos)
Código:
SELECT s.sid,
s.serial#,
s.machine,
TRUNC(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed,
TRUNC(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining,
ROUND(sl.sofar/sl.totalwork*100, 2) progress_pct
FROM v$session s,
v$session_longops sl
WHERE s.sid = sl.sid
AND s.serial# = sl.serial#;
Saludos