У меня есть программа для переноса данных из базы данных oracle в базу данных сервера SQL с такой же структурой. private void migrateAllDataToMs sql () генерирует исключение {
Connection connOracle = DBConnection.getConnection();
Connection connMssql = DBConnection.getConnectionToMsSql();
Statement selectAll = connOracle.createStatement();
ResultSet tableResultSet = selectAll.executeQuery("select table_name from dba_tables where owner= 'USER1'");
//insert to mssql db
while(tableResultSet.next()) {
String tableName = tableResultSet.getString("table_name");
if(tableName.equals("DATABASECHANGELOG_CORE") || tableName.equals("GLOBAL_PARAM") ||
tableName.equals("LOG") || tableName.equals("ORDERS") || tableName.equals("ORDER_BOOK")) {
System.out.println("do nothing");
}
else {
System.out.println(tableName);
try (PreparedStatement s1 = connOracle.prepareStatement("select * from " + tableName);
ResultSet rs = s1.executeQuery()) {
ResultSetMetaData meta = rs.getMetaData();
List<String> columns = new ArrayList<>();
for (int i = 1; i <= meta.getColumnCount(); i++)
columns.add(meta.getColumnName(i));
String identityInsertOn = "";
String sql = "INSERT INTO " + tableName + " ("
+ columns.stream().collect(Collectors.joining(", "))
+ ") VALUES ("
+ columns.stream().map(c -> "?").collect(Collectors.joining(", "))
+ ")";
String identityInsertOff = "";
if(tableName.equals("COMMODITY") || tableName.equals("DELIVERY_CODE") ||
tableName.equals("DELIVERY_CODE_ENUM") || tableName.equals("INS_CLASS") ||
tableName.equals("ORDER_TYPE") || tableName.equals("PRIVS_TO_ROLES") ||
tableName.equals("PROD_DEF_GROUP") || tableName.equals("RESULTS") ||
tableName.equals("ROLES")) {
identityInsertOn = "SET IDENTITY_INSERT " + tableName + " ON ";
identityInsertOff = " SET IDENTITY_INSERT " + tableName + " OFF ";
}
System.out.println(sql);
try (PreparedStatement s2 = connMssql.prepareStatement(
identityInsertOn +
sql +
identityInsertOff
)) {
while (rs.next()) {
for (int i = 1; i <= meta.getColumnCount(); i++) {
System.out.println(meta.getColumnType(i) + " " + i); //log which data type the column has
s2.setObject(i, rs.getObject(i));
}
s2.addBatch();
}
s2.executeBatch();
}
}
}}
}
Это на самом деле работает нормально, но в некоторых таблицах возникает это исключение SQLServerException:
Исключение в потоке "main" com. microsoft.sqlserver.jdb c .SQLServerException: преобразование из UNKNOWN в UNKNOWN не поддерживается. в com.microsoft.sqlserver.jdb c .SQLServerException.makeFromDriverError (SQLServerException. java: 234) в com.microsoft.sqlserver.jdb c .DataTypes.throwConversionError (DataTypes. * 1018) 10: 1010: 10 : .sqlserver.jdb c .SQLServerPreparedStatement.setObject (SQLServerPreparedStatement. java: 1502) в тесте : 36)
Я проверил, какие типы данных имеют таблицы, и у них есть общее, что в каждой из них есть тип данных TIMESTAMP, но в некоторых других таблицах, где также есть TIMESTAMP, исключение не появляется. В чем может быть причина этого исключения?