Преобразование из UNKNOWN в UNKNOWN является неподдерживаемым исключением (в программе Java для миграции) - PullRequest
0 голосов
/ 22 января 2020

У меня есть программа для переноса данных из базы данных 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, исключение не появляется. В чем может быть причина этого исключения?

1 Ответ

0 голосов
/ 23 января 2020

Мне просто нужно было проверить, был ли это столбец отметки времени, и если да, то заменить setObject на setDate

while (rs.next()) {
    for (int i = 1; i <= meta.getColumnCount(); i++) {
         System.out.println("Column type: " + meta.getColumnType(i) + " Iteration: " + i); //log which data type the column has
         if(meta.getColumnType(i) == 93) {
              s2.setDate(i, rs.getDate(i));
        }else {
              s2.setObject(i, rs.getObject(i));
                                }                                   
                            }

В соответствии с документацией columnType == 93 означает отметка времени, так что это то, что проверяется в предложении if. После этого вставка и набор работают нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...