Hola gnzsoloyo, me place saludarte
Mi humilde opinión.
Cita: 1) ¿El array resultante de un BULK COLLECT se puede recorrer una sola vez, o se puede hacer mas de una vez sin necesidad de volver a leer?
Se puede usar los valores de la tabla en memoria veces que quieras mientras haya una sesión activa o no ejecutes la sentencia tabla.DELETE.
La ventaja de bulk collect con respecto a los cursores, radica en que son tablas en memoria que pueden ser consultadas y llenadas sin posiciones fijas.
Cita: 2) ¿Es necesario ejecutar un UPDATE con los datos del registro leído en un momento dado, o el actualiza los campos del registro del array se encarga de eso?
Esta no la entendí
Cita: 3) ¿Es conveniente leer toda la tabla en una sola operación, o es más performantico hacerlo en bloques de N registros, usando LIMIT?
Si la tabla es muy grande es recomendable partir la operación en varias aperturas. la razón de esto, es que por bulk collect envias a memoria una cantidad enorme de registros. Este proceso no genera bloqueos en los registros resultantes, lo que permite que otras sesiones modifiquen los datos que fueron cargados a partir de la consulta. Cuando esto pasa, al momento de llegar a las posiciones de la tabla en memoria, la información no va a ser igual a la contenida en la BD, por esta razón va a buscar a los tablespace UNDO si hay transacciones que involucren estos registros. Estos tablespace tienen un parametro de configuración llamado undo_retention (15 minutos por defecto) que solo retiene cambios por este lapso de tiempo. Al pasar este tiempo, la información contenida en la tabla en memoria y la base de datos ya no va a ser la misma y no existirá rastro de un dato consistente. Cuando pasa esto se genera el error ORA-1555. (Snapshot too old)
Espero haberte ayudado.
saludos