Create SQL insert statements to CSV file Create SQL insert statements to CSV file oracle oracle

Create SQL insert statements to CSV file


Here is some pseudo code which generates an insert statement based on a JDBC result set:

String TABLE_NAME = "yourTable";StringBuilder sb = new StringBuilder("INSERT INTO ");sb.append(TABLE_NAME).append(" (");rs = stmt.executeQuery(query);rsmd = rs.getMetaData();int columnsNumber = rsmd.getColumnCount();for (int i=0; i < columnsNumber; ++i) {    String name = rsmd.getColumnName(i+1);    if (i > 0) {        sb.append(", ");    }    sb.append(name);}sb.append(")\nVALUES\n");// now generate rowsboolean start = true;while (rs.next()) {    if (start) {        start = false;    }    else {        sb.append(",\n");    }    sb.append("(");    for (int i=0; i < columnsNumber; i++) {        if (i > 0) {            sb.append(", ");        }        String columnValue = rs.getString(i+1);        sb.append(columnValue);    }    sb.append(")");}sb.append(";");


You can use DBUtils from Apache Commons to do some work for you. It has RowProcessor class which allows you to get ResultSet as a map, so it will be easier to process it for your purposes. Further steps would be to add custom method to that class and to define template for your statements.

Consider the example.

class CustomRowProcessor extends BasicRowProcessor {  List<String> getInsertList(ResultSet rs) throws SQLException {    List<String> res = new ArrayList<>();    while (rs.next()) {      String tableName = rs.getMetaData().getTableName(1);      String template = "INSERT INTO %s (%s) VALUES (%s);";      String columns = toMap(rs).keySet().stream()          .collect(Collectors.joining(", "));      String values = toMap(rs).values().stream()          .map(v -> "'" + v + "'")          .collect(Collectors.joining(", "));      res.add(String.format(template, tableName, columns, values));    }    return res;  }}

Having the above and DBUtils on classpath, a significant part of your original code can be refactored as follows.

for (String query : queries) {  rs = stmt.executeQuery(query);  for (String insert : new CustomRowProcessor().getInsertList(rs)) {    writer.write(insert + "\n");  }}