Olá,
Estou fazendo importações de dados… tem q ser na mão mesmo, e com JDBC.
Como nao posso trazer 1.200.000 pra um resultSet, paginei as consulta com ROWNUM no Oracle, e LIMIT / OFFSET no MySql
Na hora de inserir, criei um método pra inserir a “pagina” consultada, segue abaixo um trecho:
if ( rs != null ) {
String statement = "INSERT INTO " + tableName +
"( @COLUMNS ) VALUES( @PARAMETERS );";
int columnCount = rs.getMetaData().getColumnCount();
String columns = "";
String parameters = "";
for ( int i=0; i < columnCount; i++ ) {
columns += rs.getMetaData().getColumnName(i+1) + ",";
parameters += "?,";
}
columns = columns.substring(0, columns.length() - 1);
parameters = parameters.substring(0, parameters.length() - 1);
statement = statement.replace("@COLUMNS", columns);
statement = statement.replace("@PARAMETERS", parameters);
while ( rs.next() ) {
stmt = conn.prepareStatement( statement );
for ( int i=1; i <= columnCount; i++ ) {
switch ( rs.getMetaData().getColumnType(i) ) {
case Types.INTEGER : {
stmt.setInt(i, rs.getInt(i));
break;
}
case Types.SMALLINT : {
stmt.setShort(i, rs.getShort(i));
break;
}
case Types.CHAR : {
stmt.setString(i, rs.getString(i));
break;
}
case Types.VARCHAR : {
stmt.setString(i, rs.getString(i));
break;
}
case Schema.VARCHAR4000 : {
stmt.setString(i, rs.getString(i));
break;
}
case Types.TIMESTAMP : {
stmt.setTimestamp(i, rs.getTimestamp(i));
break;
}
}
}
stmt.execute();
stmt.close();
importCount++;
}
}
Que acham. Feio? Alguma maneira melhor?