sql >> Base de Datos >  >> RDS >> Oracle

Inserción/Actualización por lotes de MyBatis para Oracle

La respuesta aceptada no es la forma recomendada de manejar operaciones por lotes. No muestra verdaderas declaraciones por lotes ya que el modo de ejecución por lotes debe usarse al abrir una sesión. Vea esta publicación en la que un colaborador de código recomendó que la forma correcta de actualizar (o insertar) por lotes es abrir una sesión en modo por lotes y llamar repetidamente a actualizar (o insertar) para un solo registro.

Esto es lo que funciona para mí:

public void updateRecords(final List<GisObject> objectsToUpdate) {
    final SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);
    try {
        final GisObjectMapper mapper = sqlSession.getMapper(GisObjectMapper.class);
        for (final GisObject gisObject : objectsToUpdate) {
            mapper.updateRecord(gisObject);
        }
        sqlSession.commit();
    } finally {
        sqlSession.close();
    }
}

No use foreach en su actualización/inserción y asegúrese de que solo actualice/inserte un solo registro. Me encontré con errores de Oracle irresolubles al hacerlo de acuerdo con la respuesta aceptada (carácter no válido, declaración no finalizada, etc.). Como indica la publicación vinculada, la actualización (o inserción) que se muestra en la respuesta aceptada es en realidad solo una declaración sql gigante.